【问题标题】:Updating the LAF of a different class更新不同类别的 LAF
【发布时间】:2016-05-17 05:24:39
【问题描述】:

在我编写的“Battleship”程序中,我包含了将程序的“外观”更改为 SystemDefault、“Metal”(Java 默认)或“Motif”(也包含在 Java 中)的可能性。如果您从 JComboBox 中选择所需的 LAF(--> 更改预定义的字符串,lookFeel)并按下确认按钮,则会调用 UIManager.setLookAndFeel(lookFeel),并且还会调用 SwingUtilities.updateComponentTreeUI(this) 和方法 updateUI(),如下所示代码:

public static void updateUI() {
        //SwingUtilities.updateComponentTreeUI();
        SwingUtilities.updateComponentTreeUI(colorChooser);
        SwingUtilities.updateComponentTreeUI(shipChooser);
        SwingUtilities.updateComponentTreeUI(guide);
        SwingUtilities.updateComponentTreeUI(menu_bar);
        SwingUtilities.updateComponentTreeUI(menu_general);
        SwingUtilities.updateComponentTreeUI(menu_customization);
        SwingUtilities.updateComponentTreeUI(lafChooser);

        SwingUtilities.updateComponentTreeUI(LAN.lanframe);
        SwingUtilities.updateComponentTreeUI(LAN.hostframe);
        SwingUtilities.updateComponentTreeUI(LAN.joinframe);
    }

但是,此代码不会更新属于不同类的其他窗口。因此,如果我启动我的主程序,然后更改外观,这些窗口不会受到影响。那些实际创建框架的类不是问题,但是我的主程序只是扩展了 JFrame(我可能不会再这样做了,但是当我开始编写这个程序时,我对 Java 是全新的)。 现在我的问题是:如何更改此类的 LAF? 提前致谢!

【问题讨论】:

  • 从 JFrame 扩展类的主框架的 LAF 变化有问题吗?
  • 默认情况下,JFrame(或其他顶级前辈)是目标,例如SwingUtilities.updateComponentTreeUI(myLocalVariableForJFrame);
  • 考虑到我尝试过并且经常失败,因为我的口味正确,所以我刚刚决定更改我的主类 - 它现在创建了一个 JFrame 实例,而不是扩展 JFrame。我猜想扩展 JFrame 而不是创建实例可能是愚蠢的 ^^

标签: java swing look-and-feel swingutilities


【解决方案1】:

如果getSupportsWindowDecorations() 的结果对于给定的LookAndFeeltrue,您可以在JRootPane 上调用setWindowDecorationStyle()UIManager Defaults 中引用了一个完整的示例here

【讨论】:

    【解决方案2】:

    请参阅How to change swing applicaiton's look and feel at runtime?,了解如何在应用程序的所有窗口上调用 updateComponentTreeUI。

    请注意,updateComponentTreeUI 会递归更新所有子组件,因此您不需要为每个组件调用它,而是为所有窗口(框架)调用它。

    【讨论】:

    • 好吧,如果我只在框架上调用它就行不通(也许我应该在根窗格或其他地方调用它),但无论如何,我已经改变了我的程序结构所以我的主类不再扩展 JFrame。我还在我的问题下方的评论中写道,但我猜你错过了。不过还是谢谢你!
    • 哦,还有一件事:您无法将已经在屏幕上渲染的帧的外部 LAF 从本地正确更新为非本地。这是一个 Swing 限制。您需要关闭框架,更改 LAF,然后再次打开它。 updateComponentTreeUI 适用于框架内的组件,并且 - 请检查 - 在非本地 LAF 之间切换,例如在 Metal LAF 的变体之间切换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多