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