为什么JList选择会出现两次?

时间:2009-03-14 17:16:33

标签: java swing jlist

我有一个带有一些项目的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

知道为什么会这样吗?

谢谢, 帕特里克

2 个答案:

答案 0 :(得分:13)

更改选择时,可能会发生一个或两个事件,具体取决于实现。如果选择索引#4并单击第二个项目,则会发生以下情况:

  • 首先,索引#4是UNSELECTED。根据型号,questionaireNamesList.getSelectedIndex()可合法返回2或-1。
  • 第二,索引#2是SELECTED。此时,questionaireNamesList.getSelectedIndex()肯定会返回2.

因此,有两个事件被解雇。如何生成这些事件的定义允许不同JVM实现的余地确实略有不同。

注意:您应该检查ListSelectionEvent#getValueIsAdjusting()的值,以查看您正在处理的事件是否是一系列事件中的事件。您可能需要忽略返回true的所有事件。

答案 1 :(得分:2)

继Eddie的回答之后,请查看事件中的getValueIsAdjusting方法。