使用多个ActionListener创建多个JCheckBox

时间:2013-08-15 11:10:00

标签: java swing actionlistener jcheckbox itemlistener

我在下面制作了这个示例来模拟多个JCheckBox创建及其Action Listener。

int global=0;

//some code

JCheckBox[] checkBox = new JCheckBox[2];

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

        checkBox[i] = new JCheckBox(strings[i]);
        panel.add(checkBox[i]);

          checkBox[i].addItemListener(new ItemListener() {

                @Override
                public void itemStateChanged(ItemEvent evt) {
                    if (evt.getStateChange() == ItemEvent.SELECTED){
                        JOptionPane.showConfirmDialog(null, "Message"+global);
                    }
                }
            });                                                             
          global++;
        }

我没有得到的是Dialog的输出始终是“Message 2”。在我的逻辑中,如果我为每个复选框声明一个AddItemListener,我应该为每个复选框接收两个不同的对话框,例如“Message 1”和“Message 2”。我在这做错了什么?如何处理这个?

提前致谢

3 个答案:

答案 0 :(得分:2)

首次调用showConfirmDialog()时,global的值已经为2.如果您希望每个复选框都显示不同的消息,请在{global++之前(在每次调用时递增) 1}}这将使你更清楚。

  

如果我为每个checkBox声明一个AddItemListener,我应该   为每个复选框接收两个不同的对话框,例如“消息”   1“和”消息2“

如果您知道每个复选框只有一个侦听器,为什么您认为每个复选框应该调用两个(不同的)侦听器方法?

更可能的解决方案之一可能是实现您自己的JOptionPane.showConfirmDialog(null, "Message"+global);,它已存储要在其实例变量中显示的消息(或只是数字)。

答案 1 :(得分:2)

global与您在代码中创建的JChekcbox对象无关。因此,每当应用程序调用{​​{1}}时,它正在读取itemStateChanged的最新值global。要实现您想要的任何内容,您应该以这种方式更改代码:

2

答案 2 :(得分:1)

在您的代码中,在循环的每次迭代中,global都会增加1。循环退出后全局值为2,这就是“消息2”的原因。如果这些数字代表数组中的位置,那么我会尝试:

    @Override
    public void itemStateChanged(ItemEvent evt) {
        int loc = indexInArray(evt.getItem(),checkBox);
        if (evt.getStateChange() == ItemEvent.SELECTED){
            JOptionPane.showConfirmDialog(null, "Message"+global);
        }
    }
});

您可以在indexInArray方法中实现简单搜索:

public int indexInArray(Object []objects, Object obj){
    for(int i = 0 ; i < objects.length; i++){
        if(objects[i] == obj){
            return i;
        }
    }
    return -1;
}