我在下面制作了这个示例来模拟多个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”。我在这做错了什么?如何处理这个?
提前致谢
答案 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;
}