3

我在下面制作了这个示例来模拟多个 JCheckBox 创建及其动作侦听器。

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++;
        }

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

提前致谢

4

3 回答 3

2

showConfirmDialog()首次调用时的global值已经为 2。如果您希望每个复选框都有不同的消息,请尝试在global++之前放置(每次调用时都会增加)JOptionPane.showConfirmDialog(null, "Message"+global);,这将使您更清楚。

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

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

更可能的解决方案之一是实现您自己的解决方案,该解决方案ItemListener已存储要在其实例变量中显示的消息(或只是数字)。

于 2013-08-15T11:13:45.240 回答
2

globalJChekcbox与您在代码中创建的对象无关。所以,每当itemStateChanged被应用程序调用时,它正在读取的最新值global2。要实现您正在寻找的任何东西,您应该以这种方式更改您的代码:

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

        checkBox[i] = new JCheckBox(strings[i]);
        panel.add(checkBox[i]);
          checkBox[i].addActionCommand(String.valueOf(i+1));
          checkBox[i].addItemListener(new ItemListener() {

                @Override
                public void itemStateChanged(ItemEvent evt) {
                    if (evt.getStateChange() == ItemEvent.SELECTED){
                        JOptionPane.showConfirmDialog(null, "Message"+((JCheckBox)evt.getSource()).getActionCommand());
                    }
                }
            });   
         global++;
     }   
于 2013-08-15T11:19:42.903 回答
1

在您的代码中,全局在循环的每次迭代中增加 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;
}              
于 2013-08-15T11:21:31.423 回答