【发布时间】: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