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

时间:2019-06-26 21:43:34

标签: java swing look-and-feel

我正试图允许用户更改应用程序主题,例如暗/亮等。

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

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上色:菜单 jpanel 2上色:背景

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

2 个答案:

答案 0 :(得分:0)

您是否尝试过实现SystemColor对象? SystemColors可以更改。它们的红色/绿色/蓝色值与基础操作系统主题相关。例如,如果用户更改其操作系统主题的文本突出显示颜色,则SystemColor.textHighlight也会随之更改。在下一次重绘时,使用该SystemColor对象的所有Java组件都会以用户更新的颜色进行重绘。

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

  • 罗宾。

答案 1 :(得分:0)

正如@madprogrammer在评论中已经提到的-通常不建议在运行时更改外观(L&F),因为这可能会导致许多不良行为和潜在问题。

更具体地说-不同的L&F将具有不同的组件大小,间距,边框和整体视觉样式(除非您使用相同的L&F,但主题/外观不同)。在许多情况下,这会使您的应用程序UI外观和在不同的L&F上的表现不一致,尤其是如果您想要的只是具有深色和浅色主题但UI布局/样式相同的情况。在运行时更改L&F可能还会在一定程度上重置某些组件的状态,这可能会导致应用程序出现逻辑错误。

更好的方法是使用支持深色和浅色(或任何其他)主题/皮肤的单个L&F,因为如果仅在与L&F相同的L&F的不同实现/配置之间进行更改,肯定会减少问题的发生开发人员很可能是造成这种可能性的原因。您可以在以下其他SO主题中找到当前可用L&F的完整列表:Java Look and Feel (L&F)

尽管您准备进行投资,编写自己的L&F也可能是一个很好的解决方案。但是请不要误会,这不是一件容易的事,并且需要很多时间和Swing知识来创建一个。特别是,Swing和L&F API的文档记录很少,原始开发人员并未提供很多有关如何制作一个的提示。您只能走反复试验之路。