java - JButton 数组 Action 监听器仅适用于最后一个按钮

标签 java arrays swing jbutton actionlistener

我制作了一个按钮数组,并尝试在 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");
            }
        }
    }
}

最佳答案

方法 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
           }
    }

关于java - JButton 数组 Action 监听器仅适用于最后一个按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15719209/

相关文章:

java - cucumber.runtime.CucumberException : No backends were found. 请确保您的 CLASSPATH 上有后端模块

java - 想要确认 tomcat 正在使用的堆大小

C++将数组元素向右推

java - Swing 线程安全编程

java - 在透明 JPanel 上绘画时留下痕迹

java - HTTP 状态 500 - 处理程序处理失败;嵌套异常是 java.lang.NoClassDefFoundError :

java - 从 json 映射到对象时得到错误的结果

javascript - 循环遍历数组时将 id 绑定(bind)到删除按钮

arrays - 如果数组是值类型并因此被复制,那么它们为什么不是线程安全的呢?

java - 小程序中的 start() 方法删除面板