我有几个组件,都继承了JCheckBox,没有覆盖任何东西,存储在一个向量中,然后遍历并将每个组件添加到一个对话框中
CreateLists(); // initialises the checkbox vector
for(int i = 0; i < checkBoxes.size() ; i++){
myPanel.add(checkBoxes.elementAt(i));
}
其中一些复选框已被选中。
我现在的问题是:当我打开对话框并选择或取消选中任何复选框时,向量中复选框的值不会改变。选定的未选中和未选中的未选中
我也尝试使用JPanels getCompoents()获取新值,但这些值也是错误的。
复选框继承者中的ItemListener确认更改确实发生,但每当我尝试获取新值时,与初始化复选框的那些值相同。
以下是我用来跟踪更改的控制台输出:
create lists
print values:
checkBox1 = true
checkBox2 = true
checkBox3 = false
checkBox2 clicked new value = false
checkBox3 clicked new value = true
print values:
checkBox1 = true
checkBox2 = true
checkBox3 = false
答案 0 :(得分:0)
以下是一些代码和信息:
CreateList()将监视列表与可观察的内容进行比较,相应地创建复选框(true =观看等)并将它们添加到新的初始化矢量中。
要阅读我使用的值:
Component[] components = pnlGesamt.getComponents();
for(int i = 0; i < components.length; i++){
if(components[i] instanceof WLElementCheckBox){
WLElementCheckBox cb = (WLElementCheckBox) components[i];
System.out.println(cb.WlElement().Name() + " = " + cb.isSelected());
}
}
JCheckBox继承者:
private WatchListElement wlElement;
public WLElementCheckBox (WatchListElement wl, boolean selected)
{
super();
WlElement(wl);
setSelected(selected);
setText(wlElement.Name());
addItemListener(new MIL());
}
public WatchListElement WlElement ()
{
return wlElement;
}
public void WlElement (WatchListElement wlElement)
{
this.wlElement = wlElement;
}
public class MIL implements ItemListener{
public void itemStateChanged(ItemEvent arg0) {
System.out.println("Ckb " + wlElement.Name() +" geklickt Item neu = " + isSelected());
}
}
答案 1 :(得分:0)
由于您从另一个线程(例如main)而不是事件调度线程(EDT)查询,因此对复选框的更改不可见是很有可能的。 Swing不是线程安全的。当您选中复选框时,将在EDT上设置值,但其他线程可能将旧状态保存在内存中,并且不检查它是否已更新。因此,您需要做的第一件事是确保当您检查复选框的状态时,您是通过致电SwingUtilities.invokeAndWait()
或SwingUtilities.invokeLater()
从EDT进行的。
有关发生这种情况的更多信息,请在Java中搜索Thread Safety。
(另外,不要试图使用同步来解决问题,否则可能会在GUI中出现死锁)。
最后一个专业提示:使用新的Java for循环语法使代码更易于读写,并且在某些情况下更有效。你的代码......
for(int i = 0; i < checkBoxes.size() ; i++){
myPanel.add(checkBoxes.elementAt(i));
}
......可以变成......
for(JCheckBox c : checkBoxes) {
myPanel.add(c);
}
这适用于数组和任何Iterable
(包括Collection
)的内容。