在框架中获取按钮

时间:2014-04-06 12:26:34

标签: java swing

我需要为每个按钮添加一个监听器,如下所示:

 for(i = 0; i < 10; i++)
     buttons[i].addActionListener(actionListener);

按钮已经存在,我需要获取框架中的按钮列表。

1 个答案:

答案 0 :(得分:1)

您可以使用getComponents()方法获取框架中的所有JButton。

一个工作示例:

frame = new JFrame();
frame.setVisible(true);
frame.setSize(250, 250);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

GridLayout layout = new GridLayout();
frame.setLayout(layout);

for (int i = 0; i < 10; ++i)
    frame.getContentPane().add(new JButton("A"));

Component[] components = frame.getContentPane().getComponents();
ActionListener actionListener = new ActionListener()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        System.out.println("Hello");
    }
};

for (Component component : components)
{
    if (component instanceof JButton)
    {
        ((JButton) component).addActionListener(actionListener);
    }
}

它添加了10个按钮,然后添加了监听器。

提示:如果你以创造性的方式创建按钮,就不要这样做,它只是矫枉过正!

以上可能更简单:

frame = new JFrame();
frame.setVisible(true);
frame.setSize(250, 250);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

GridLayout layout = new GridLayout();
frame.setLayout(layout);

ActionListener actionListener = new ActionListener()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        System.out.println("Hello");
    }
};

for (int i = 0; i < 10; ++i)
{
    JButton button = new JButton("A");
    button.addActionListener(actionListener);
    frame.getContentPane().add(button);
}

相同的代码,没有两个fors!

但是如果你不知道你会有多少按钮,那么第一个代码就可以了,如果你知道并且你只是想在事情发生之前避免一个动作,那么考虑使用一个布尔变量。

类似的东西:

// out
boolean specialEvent;

// inside
ActionListener actionListener = new ActionListener()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        if (!specialEvent) return; // the special event is still false so no you can't do anything
        System.out.println("Hello");
    }
};