1

我制作了一个按钮数组,并尝试在 for 循环中为每个按钮添加一个 ActionListener,并使用 for 循环监听所有按钮,但问题是唯一响应的按钮是最后一个创建的按钮。我究竟做错了什么?

nums = new JButton[13];
ListenForButton lfb = new ListenForButton();
for (int i = 1; i < 13; i++) {
    nums[i].addActionListener(lfb);
}

private class ListenForButton implements ActionListener{
    public void actionPerformed(ActionEvent e) {
        for(int i=0;i<13;i++){
            if( e.getSource() == nums[i]) {
                System.out.println("pressed");
            }
        }
    }
}
4

2 回答 2

1

方法 ActionEvent.getSource() 返回一个 Object 类型的实例,为此您需要将其类型转换为 JButton

if( e.getSource() == nums[i])

是真的,所以这样做而不是上面的陈述:

if( ((JButton)e.getSource()) == nums[i])

也试试这个:

nums = new JButton[13];

for (int i = 0; i < 13; i++) 
 {
    nums[i] = new JButton();
    nums[i].addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent ae)
       {
           System.out.println("pressed");
       }
    });
 }

或使用 ActionCommand,如下所示:

nums = new JButton[13];

ListenerForButton lfb = new ListenerForButton();
for (int i = 0; i < 13; i++) 
 {
    nums[i] = new JButton();
    nums[i].setActionCommand("button"+i);
    nums[i].addActionListener(lfb);
 }

 private class ListenForButton implements ActionListener{

    public void actionPerformed(ActionEvent e) {

        for(int i=0;i<13;i++){

        if( e.getActionCommand().equals("button"+i)) {
               System.out.println("pressed" + i); //for  getting which button is actually clicked
           }
    }
于 2013-03-30T14:06:32.313 回答
0

我认为你应该调用 nums[i].addActionListener(new ListenForButton()); 为了让每个按钮都有一个新的监听器

于 2013-03-30T13:54:20.350 回答