Значение JCheckBox 'сбрасывается / не изменяется - PullRequest
2 голосов
/ 21 января 2011

У меня есть несколько компонентов, все они наследуют 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 голосов
/ 24 марта 2011

Существует небольшая вероятность того, что изменения в ваших флажках не будут видны, потому что вы запрашиваете их из другого потока (например, основного) вместо потока отправки событий (EDT). Качели не потокобезопасны. Когда вы устанавливаете флажки, значения устанавливаются в EDT, но другие потоки могут сохранять старое состояние в памяти и не проверять, было ли оно обновлено. Итак, первое, что вам нужно сделать, это убедиться, что когда вы проверяете состояния своих флажков, вы делаете это из EDT, используя вызов SwingUtilities.invokeAndWait() или SwingUtilities.invokeLater().

Для получения дополнительной информации о том, почему это происходит, найдите Thread Thread в Java.

(Кроме того, не поддавайтесь искушению использовать синхронизацию для решения проблемы, иначе вы можете зайти в тупик в вашем графическом интерфейсе).

Один последний совет: использование нового синтаксиса Java for-loop делает код более легким для чтения и записи, а также более эффективным в некоторых случаях. Ваш код ...

for(int i = 0; i < checkBoxes.size() ; i++){
    myPanel.add(checkBoxes.elementAt(i));
}

... может превратиться в ...

for(JCheckBox c : checkBoxes) {
    myPanel.add(c);
}

Это работает с массивами и всем, что является Iterable (включая Collection).

0 голосов
/ 21 января 2011

Вот еще немного кода и информации:

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

    }
}
...