【问题标题】:Change background color of components with reference to Color variable java参考颜色变量java更改组件的背景颜色
【发布时间】:2015-03-02 16:46:11
【问题描述】:

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

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

private Color panelColor;
private Color textColor;

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

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

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

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

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

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

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

干杯

【问题讨论】:

  • 是的,您可能需要在每个对象上调用setBackground()。或者使用透明(非透明)组件并设置其父面板的背景,但透明度可能会很棘手。一些对象依靠不透明性来正确擦除它们的视口。
  • 嗯,在这种情况下,似乎最好调用每个组件的 setBackground(),即使这需要一段时间。我会避免弄乱透明度解决方案,我的 UI 很忙,所以我可能很快就会把它弄得一团糟。

标签: java swing colors background components


【解决方案1】:

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

在此线程中使用 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 替换传入的 Color 变量的名称。

【讨论】:

    猜你喜欢
    • 2013-02-02
    • 2015-12-06
    • 2012-07-10
    • 2012-04-02
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多