在我的程序中,我希望用户能够更改程序的配色方案。我有一种方法可以通过颜色传递颜色,以使用UIManager设置所有面板的背景。
public void changeColourScheme(Color c) {
UIManager.put("Panel.background", c);
SwingUtilities.updateComponentTreeUI(this);
}
但是,我遇到的问题是它没有改变面板的颜色。此方法位于JFrame的类中。
答案 0 :(得分:1)
直接从Swing API Docs复制。
公共静态无效updateComponentTreeUI(Component c)
简单的外观更改:询问 树 中的每个节点 to updateUI()-即使用 当前的外观。
注意重点。您的代码无效,因为您正在将{User1=[Admin, Integrator], User2=[Auditor, Manager]}
作为参数传递给this
。由于您将面板作为参数传递,因此只有面板内部的组件和面板本身会更新其UI。您必须传递包含程序中所有其他面板的容器,即您的updateComponentTreeUI()
JFrame
答案 1 :(得分:0)
仅因为UIDefaults
更改仅对新创建的组件
要使该功能正常工作,必须先重新启动应用,然后再启动gui并更改UIManager
中默认值的背景,否则您将必须手动进行操作(逐面板)。
如果您手动执行此操作,则递归会很有帮助,例如
private static void loopForPanel(Container c, Color col) {
synchronized (c.getTreeLock()) {
for (Component com : c.getComponents()) {
if (com instanceof JPanel) {
com.setBackground(col);
}
if (com instanceof Container) {
loopForPanel((Container) com,col);
}
}
}
}
然后在您的changeColourScheme
方法中使用所需的颜色将其自身传递给loopForPanel
方法的帧。