Java - 选择

时间:2016-03-07 17:06:00

标签: java swing components

我正在尝试编写我的程序代码,以便我的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会有某种等价物,但我还没有找到任何东西。

有人能够指出我正确的方向来完成我想做的事吗?我想我错过了一些非常明显的东西!

谢谢, 标记

2 个答案:

答案 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类来获取给定类型的所有子组件。