3

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

2 回答 2

1

这是更多代码和信息:

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());

    }
}
于 2011-01-21T07:11:53.440 回答
1

对复选框的更改不可见的可能性很小,因为您是从另一个线程(例如 main)而不是事件调度线程 (EDT) 查询它们。Swing 不是线程安全的。当您选中复选框时,值会在 EDT 上设置,但其他线程可能会将旧状态保存在内存中,并且不会检查它是否已更新。因此,您需要做的第一件事是确保当您检查复选框的状态时,您是从 EDT 进行的,使用对SwingUtilities.invokeAndWait()or的调用SwingUtilities.invokeLater()

有关为什么会发生这种情况的更多信息,请搜索 Java 中的线程安全。

(另外,不要试图使用同步来解决问题,否则您可能会在 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)。

于 2011-03-24T17:11:25.023 回答