【问题标题】:Swing How do I allow a User-Selected Theme?Swing 我如何允许用户选择的主题?
【发布时间】:2019-06-26 21:43:34
【问题描述】:

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

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

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 中,菜单将以绿色和红色背景为例

【问题讨论】:

  • 一般来说,不建议在 UI 建立后更改外观,是的,我知道有“官方”示例证明了这一点,但这更像是一个副作用功能和 Swing 团队实际上不鼓励它。但是,您可能会使用“剥皮”方法获得更好的运气,这可能会为您提供一种更简单的方法来实现相同的整体结果,但您仍然需要通知所有组件的更改

标签: java swing look-and-feel


【解决方案1】:

正如@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 的文档记录很差,原始开发人员没有提供很多关于如何制作的提示。你只能走试错的路。

【讨论】:

    【解决方案2】:

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

    SystemColors 的此功能允许 Java 应用程序使用配色方案绘制用户界面,这些配色方案可跟踪用户自己的操作系统配色方案偏好。对于大多数情况,例如您的情况,不需要特殊的应用程序编码。希望这会有所帮助!

    • 罗宾。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 2019-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多