我正在尝试编写我的程序代码,以便我的JFrame上的所有组件都具有一致的配色方案。为了能够做到这一点,我想使用Java的for-each循环来影响相同类型的每个组件。我已经尝试过像这样给JPanel上色了,但它没有任何影响。
public void colourGUI()
{
for (Component comp : this.getComponents())
{
if (comp instanceof JPanel)
{
((JPanel) comp).setOpaque(true);
comp.setBackground(Color.gray);
}
}
}
我原本以为这会起作用,但是当我加载应用程序时它没有生效。
我是Java的新手,我之前使用过C#这样的程序,我会使用C#的OfType<>
方法。我希望Java会有某种等价物,但我还没有找到任何东西。
有人能够指出我正确的方向来完成我想做的事吗?我想我错过了一些非常明显的东西!
谢谢, 标记
答案 0 :(得分:2)
我为第一个答案道歉。如本例所示,您的代码
public void colourGUI()
{
for (Component comp : this.getComponents())
{
if (comp instanceof JPanel)
{
((JPanel) comp).setOpaque(true);
comp.setBackground(Color.gray);
}
}
}
,确实无需改变。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.awt.Color.*;
import java.io.IOException;
import java.lang.*;
import java.util.*;
public class Test extends JFrame {
private Box boxHolder;
private JPanel scrollPaneContainer;
Test(int i) {
super("Test Frame");
this.setLayout(new BorderLayout());
this.getContentPane().add(initScrollPane(),BorderLayout.CENTER);
this.getContentPane().add(initButtonAdd(),BorderLayout.SOUTH);
for(int j = 0; j < i; j++) {
boxHolder.add(createPanel());
}
this.setLocationRelativeTo(null);
this.pack();
this.setVisible(true);
}
private Component initButtonAdd() {
JButton button = new JButton("Recolour");
button.setBackground(Color.green);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (Component comp : boxHolder.getComponents())
{
if (comp instanceof JPanel)
{
((JPanel) comp).setOpaque(true);
comp.setBackground(Color.gray);
}
}
}
});
return button;
}
private Component initScrollPane() {
scrollPaneContainer = new JPanel( new BorderLayout() );
boxHolder = Box.createVerticalBox();
scrollPaneContainer.add(boxHolder, BorderLayout.PAGE_START);
JScrollPane jSP = new JScrollPane(scrollPaneContainer);
jSP.getVerticalScrollBar().setUnitIncrement(16);
return jSP;
}
private Component createPanel() {
JPanel panel = new JPanel();
panel.setBackground(randomColor());
panel.setPreferredSize(new Dimension(100,50));
panel.add(new JLabel("a colored Panel"));
panel.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
int indexPosition = boxHolder.getComponentZOrder(panel);
try
{
boxHolder.remove(indexPosition);
}
catch(Exception ex){}
try //Will only add here if you have a component in index position 1
{
boxHolder.add(createPanel(),indexPosition);
}
catch(Exception ex){}
scrollPaneContainer.revalidate();
}
@Override public void mousePressed(MouseEvent e) {}
@Override public void mouseReleased(MouseEvent e) {}
@Override public void mouseEntered(MouseEvent e) {}
@Override public void mouseExited(MouseEvent e) {}
});
return panel;
}
private Color randomColor() {
Random rand = new Random();
float r = rand.nextFloat() / 2f ;
float g = rand.nextFloat() / 2f;
float b = rand.nextFloat() / 2f;
Color randomColor = new Color(r, g, b);
return randomColor;
}
public static void main(String[] args) {
new Test(6);
}
}
您可以从GUI发布更多代码吗?
答案 1 :(得分:0)
当你提出一个问题时,发布一个适当的SSCCE来证明问题。基本代码看起来很合理,但如果没有SSCCE
,我们无法告诉上下这个代码的使用方式。例如,我们不知道this.getComponents()所指的是什么。
我猜测问题是你的代码没有使用递归,所以你实际上并没有得到框架上所有组件的列表。这很容易测试,只需在循环中添加一个显示语句,即可查看实际找到的面板数。
框架的结构比你想象的要复杂得多。请查看Using Top Level Containers以获得更好的结构描述。
您可以使用确实使用递归的Swing Utils类来获取给定类型的所有子组件。