我需要为每个按钮添加一个监听器,如下所示:
for(i = 0; i < 10; i++)
buttons[i].addActionListener(actionListener);
按钮已经存在,我需要获取框架中的按钮列表。
答案 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");
}
};