0

在我编写的“Battleship”程序中,我包含了将程序的“外观”更改为 SystemDefault、“Metal”(Java 默认)或“Motif”(也包含在 Java 中)的可能性。JComboBox如果您从(--> 更改预定义的字符串, )中选择所需的 LAFlookFeel并按下确认按钮,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?提前致谢!

4

2 回答 2

3

如果 的结果getSupportsWindowDecorations()true给定的LookAndFeel,您可以setWindowDecorationStyle()JRootPane. UIManager Defaults中引用一个完整的示例。

于 2016-02-07T15:16:54.437 回答
0

请参阅如何在运行时更改摇摆应用程序的外观?关于如何在应用程序的所有窗口上调用 updateComponentTreeUI。

请注意,updateComponent Tree UI 将递归更新所有子组件,因此您无需为每个组件调用它,而是为所有窗口(框架)调用它。

于 2016-02-24T16:32:27.343 回答