【问题标题】:Java - Select All GUI Components of TypeJava - 选择所有类型的 GUI 组件
【发布时间】:2016-06-21 08:29:46
【问题描述】:

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

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

谢谢, 标记

【问题讨论】:

  • 难道你没有使用repaint()revalidate()
  • 嗨,就像我说的,我对 Java 的方法并不太熟悉。我什么时候需要在哪里使用这些? @丹
  • 我刚刚发布了一个答案。如果它不起作用,请发表评论
  • 已回复您的帖子。认为它几乎就在那里,但由于某种原因仍然没有触发。 @丹
  • 我才看到你的上一篇文章,我现在测试一下,让你知道。谢谢@丹

标签: java swing components


【解决方案1】:

我为我的第一个回答道歉。如本例所示,您的代码,

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 中发布更多代码吗?

【讨论】:

  • 刚刚试了一下,没有任何改变,还有比这更根本的吗?
  • 首先顺序应该是revalidate()和repaint()。但是,没有必要这样做,因为只要组件的属性发生更改,Swing 组件就会自动执行此操作。
【解决方案2】:

当您提出问题时,请发布适当的 SSCCE 来说明问题。基本代码看起来很合理,但是如果没有SSCCE,我们就无法了解这段代码是如何使用的上下文。例如我们不知道 this.getComponents() 指的是什么。

我猜问题是您的代码没有使用递归,因此您实际上并没有获得框架上所有组件的列表。这很容易测试,只需在循环中添加一条显示语句即可查看您实际找到了多少面板。

框架的结构比您想象的要复杂。查看Using Top Level Containers 以获得更好的结构描述。

您可以使用Swing Utils 类,它使用递归来获取给定类型的所有子组件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-09
    • 2013-08-07
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    相关资源
    最近更新 更多