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