JCheckBox的值重置/不会改变

时间:2011-01-21 06:49:56

标签: java swing jcheckbox

我有几个组件,都继承了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

2 个答案:

答案 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)的内容。