假设我有一个按钮数组
private JButton[] myButtons = new JButton[5];
for (int i=0; i<5; i++)
{
myButtons[i] = new JButton(Integer.toString(i));
myButtons[i].setSize(50, 50);
panel.add(myButtons[i]);
}
如何为这些按钮添加一个监听器,以便当我点击其中一个按钮时,我知道它在哪个数组位置索引?
答案 0 :(得分:2)
你有点不在乎,首先在按钮上添加ActionListener
myButtons[i].addActionListener(this); // Or some other ActionListener
在actionPeformed
方法中,您可以使用ActionEvent#getSource
@Override
public void actionPerformed(ActionEvent evt) {
for (JButton btn : myButtons) {
if (btn.equals(evt.getSource()) {
// Do what ever you need
break;
}
}
}
您还可以使用actionCommand
JButton
属性
for (int i=0; i<5; i++)
{
myButtons[i] = new JButton(Integer.toString(i));
myButtons[i].setActionCommand("button " + i);
myButtons[i].addActionListener(this);
panel.add(myButtons[i]);
}
调用actionPeformed
时,请使用ActionEvent#getActionCommand
确定按下了哪个按钮。
更好的想法可能是为每个按钮创建一个专用的ActionListener
...
public class ButtonActionHandler implements ActionListener {
private final JButton button;
public ButtonActionHandler(JButton button) {
this.button = button;
}
public void actionPerformed(ActionEvent evt) {
// Do what ever you need to do with the button...
}
}
for (int i=0; i<5; i++)
{
myButtons[i] = new JButton(Integer.toString(i));
myButtons[i].addActionListener(new ButtonActionHandler(myButtons[i]));
panel.add(myButtons[i]);
}
另一个想法是利用Action
API,它允许你定义一个自包含的实体,它能够配置按钮并自己处理相关的动作事件。有关详细信息,请参阅How to Use Actions
但是您可以使用哪些内容将归结为您首先需要识别按钮的原因。
答案 1 :(得分:0)
如果在类中实现ActionListener
接口,则可以在循环中添加侦听器,如下所示。例如,
class TestGUI extends JPanel implements ActionListener{
public TestGUI(){
for(int i=0; i< 5; i++){
....
myButtons[i].addActionListener(this);
}
}
或者,如果你有单独的Listener类或方法。
myButtons[i].addActionListener(new MyListener());
比在actionPerformed方法,你可以点击按钮检查,
public void actionPerformed(ActionEvent e){
if("0".equals(e.getActionCommand())){
System.out.println("First button is clicked");
}
... so on
}