Почему выбор JList происходит дважды? - PullRequest
7 голосов
/ 14 марта 2009

У меня есть JList с некоторыми предметами. Я добавил слушателя, когда выбран элемент в списке. Вот код для того, что происходит, когда элемент в списке выбран:

private void questionaireNamesListValueChanged(ListSelectionEvent evt) {
    try {
        inputPanel.setEnabled(false);
        inputPanel.setVisible(false);
        inputTextField.setText("");
        inputStatusLabel.setText("");
        int questionaireIndex = questionaireNamesList.getSelectedIndex();

        // Why will this be printed twice?
        System.out.println("Questionaire Index: " + questionaireIndex);

        if (remoteQuestionServer.getQuestionCount(questionaireIndex) == 5) {
            answerQuestionButton.setEnabled(true);
            addQuestionButton.setEnabled(false);
        } else {
            addQuestionButton.setEnabled(true);
            answerQuestionButton.setEnabled(false);
        }
    } catch (RemoteException ex) {
        ex.printStackTrace();
    }
} 

Как вы можете выше, я вставляю оператор System.out.print и каждый раз, когда я нажимаю на что-то в списке, я получаю два выхода для этого элемента, например.

Questionaire Index: 4
Questionaire Index: 4
Questionaire Index: 2
Questionaire Index: 2
Questionaire Index: 0
Questionaire Index: 0
Questionaire Index: 2
Questionaire Index: 2

Есть идеи, почему это происходит?

Спасибо, Patrick

Ответы [ 2 ]

13 голосов
/ 14 марта 2009

При изменении выбора может произойти одно или два события, в зависимости от реализации. Если выбран индекс № 4 и вы щелкнете по второму элементу, произойдет следующее:

  • Во-первых, индекс № 4 НЕ ВЫБРАН. В зависимости от модели questionaireNamesList.getSelectedIndex() может по закону вернуть либо 2, либо -1.
  • секунда, индекс № 2 ВЫБРАН. На этом этапе questionaireNamesList.getSelectedIndex() обязательно вернет 2.

Таким образом, происходит два события. Определение того, как генерируются эти события, позволяет в разной степени реализовывать различные реализации JVM.

ПРИМЕЧАНИЕ: вам, вероятно, следует проверить значение ListSelectionEvent#getValueIsAdjusting(), чтобы увидеть, является ли обрабатываемое событие одним из серии событий. Вам, вероятно, нужно игнорировать все события, в которых возвращается true.

2 голосов
/ 14 марта 2009

В дополнение к ответу Эдди посмотрите метод getValueIsAdjusting для события.

...