UI管理器不会更改面板背景

时间:2019-04-27 21:29:09

标签: java swing

在我的程序中,我希望用户能够更改程序的配色方案。我有一种方法可以通过颜色传递颜色,以使用UIManager设置所有面板的背景。

public void changeColourScheme(Color c) {
        UIManager.put("Panel.background", c);
        SwingUtilities.updateComponentTreeUI(this);
    }

但是,我遇到的问题是它没有改变面板的颜色。此方法位于JFrame的类中。

2 个答案:

答案 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方法的帧。