参考 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 替换传入颜色的名称变量。
我正在尝试创建一个包含大量 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 替换传入颜色的名称变量。