Swing 如何允许用户选择的主题?

Swing How do I allow a User-Selected Theme?

我正在尝试允许用户更改应用程序主题,例如 dark/light 等

到目前为止,我一直在使用:

for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if (newTheme.equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        SwingUtilities.updateComponentTreeUI(getRootPane());
                    }
                });


                break;
            }
        }
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
    }

我不确定我是否真的应该改变整个外观。使用这种方法的问题是,我看不出有什么办法可以将 jPanel 设置为随主题变化的任何内容。

我的意思的一个例子是设置: jPanel 1 to color: 菜单 jpanel 2 颜色:背景

在主题1中,菜单可能是灰色的,背景可能是蓝色的。以主题 2 为例,菜单为绿色,背景为红色

您是否尝试过实现 SystemColor 对象? SystemColors 可以改变。它们的 red/green/blue 值与基础的 OS 主题相关联。例如,如果用户更改了 OS 主题的文本突出显示颜色,那么 SystemColor.textHighlight 也会随之更改。在下一次重绘时,任何使用该 SystemColor 对象的 Java 组件都会使用用户更新后的颜色重绘。

SystemColors 的此功能允许 Java 应用程序使用跟踪用户自己的 OS 配色方案首选项的配色方案来绘制用户界面。对于像您这样的大多数情况,不需要特殊的应用程序编码。希望这对您有所帮助!

  • 罗宾

正如@madprogrammer 在评论中已经提到的那样——通常不建议在运行时更改外观和感觉 (L&F),因为它可能会导致很多不需要的行为和潜在问题。

更具体地说 - 不同的 L&F 将具有不同的组件大小、间距、边框和整体视觉风格(除非您使用相同的 L&F 但具有不同的 themes/skins)。在许多情况下,这将使您的应用程序 UI 在那些不同的 L&F 上看起来和执行不一致,特别是如果您只想拥有深色和浅色主题但相同 UI layout/style。在运行时更改 L&F 也可能会在某种程度上重置某些组件的状态,这可能会导致您的应用程序出现逻辑错误。

更好的方法是使用支持暗色和亮色(或任何其他)的单一 L&F themes/skins,因为如果你只在不同 implementations/configurations 之间切换,问题肯定会更少与 L&F 开发人员完全相同的 L&F 最有可能解释了这种可能性。您可以在此处的其他 SO 主题上找到当前可用 L&F 的完整列表:Java Look and Feel (L&F)

尽管如果您准备投资,编写您自己的 L&F 也是一个很好的解决方案。但是不要误会,这不是一件容易的事,需要大量时间和 Swing 知识才能创建。 Swing 和 L&F API 的文档尤其少,原始开发人员没有提供很多关于如何制作它们的提示。只能走试错之路。