参考 Color 变量更改组件的背景颜色 java

Change background color of components with reference to Color variable java

我正在尝试创建一个包含大量 JPanel 和文本部分的 JFrame,所有这些都具有默认颜色(面板的背景为白色,文本为黑色)。我想允许用户在运行时动态更改这些,所以我实现了一个 JColorChooser 对话框,我可以在其中单击一个按钮,显示对话框,然后我可以从那里保存颜色。

我的默认颜色是在实例变量中设置的,如下所示:

private Color panelColor;
private Color textColor;

要设置面板​​的背景颜色,我使用:

JPanel samplePanel = new JPanel();
samplePanel.setBackground(panelColor); //panelColor has already been instantiated

这很好用,使面板变白了。但是,当我尝试使用 JColorChooser 加载新的 Color 以供使用时,面板不会改变。选择颜色后我使用的代码是:

if(newColor != null)
{
    panelColor = newColor;
    myFrame.repaint();
}

我的所有组件都在一个 JFrame 中,我认为在 JFrame 上调用 repaint() 会依次调用 paintChildren() 并一直向下级联到最低级别。

我认为我的问题在于我对如何在 Java 中处理对象的理解。我知道对象是按引用传递的,但我还假设当我设置组件的背景颜色时,这是通过引用传递方案实现的,我开始怀疑这一点。当我调用 setBackground() 时,我传入的 Color 参数是否最终成为传值副本?

如果我的预感是正确的,这是否意味着我应该编写一个方法,其中包含所有需要更改其背景的组件,并调用每个组件的 setBackground(),将新的 Color 变量传入值?

干杯

由于在使用 setBackground() 时 Color 对象是按值传递给组件的,正如 markspace 所建议的,每个组件都将调用其单独的方法。

在此线程中使用 Dan O 提供的代码的修改版本:Iterate through all objects in Jframe, 我提出了一个解决方案,允许修改 JFrame(或任何容器)中的每个 JPanel。这是一个递归解决方案,因此任何嵌套的 Container 实例也将迭代其子实例。

public void setPanelColor(Container parent)
{
    for(Component c : parent.getComponents())
    {
        if(c instanceof Container)
        {
            if(c instanceof JPanel)
            {
                c.setBackground(panelColor);
            }

            setPanelColor((Container)c);
        }
    }
}

因为我使用实例变量 (panelColor) 来保存颜色,所以我可以从方法中引用它,但是您可以轻松地将它作为参数传入,并用 panelColor 替换传入颜色的名称变量。