我有一个带有一些项目的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
知道为什么会这样吗?
谢谢,帕特里克
更改选择时,可能会发生一个或两个事件,具体取决于实现.如果选择索引#4并单击第二个项目,则会发生以下情况:
首先,索引#4是UNSELECTED.根据型号,questionaireNamesList.getSelectedIndex()
可以合法地返回2或-1.
第二,索引#2是SELECTED.此时,questionaireNamesList.getSelectedIndex()
肯定会返回2.
因此,有两个事件被解雇.如何生成这些事件的定义允许不同JVM实现的余地确实略有不同.
注意:您应该检查值,ListSelectionEvent#getValueIsAdjusting()
以查看您正在处理的事件是否是一系列事件中的事件.您可能需要忽略返回的所有事件true
.