Warum JList Auswahl zweimal auftreten?
Frage
Ich habe eine JList mit einigen Einzelteilen. Ich habe einen Hörer für, wenn ein Element in der Liste hinzugefügt ausgewählt wird. Hier ist der Code für das, was passiert, wenn ein Element in der Liste ausgewählt ist:
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();
}
}
Wie Sie können oben habe ich eine System.out.print
Aussage in und jedes Mal, wenn ich Sie auf etwas in der Liste, die ich bekommen zwei Ausgänge für das Element, zum Beispiel.
Questionaire Index: 4
Questionaire Index: 4
Questionaire Index: 2
Questionaire Index: 2
Questionaire Index: 0
Questionaire Index: 0
Questionaire Index: 2
Questionaire Index: 2
Jede Idee, warum dies geschieht?
Danke, Patrick
Lösung
Wenn Sie eine Auswahl ändern, ein oder zwei Ereignisse auftreten können, je nach Implementierung. Wenn der Index # 4 ausgewählt ist und Sie auf dem zweiten Element klicken, dann geschieht folgendes:
- Zuerst Index # 4 ist unmarkiert. Je nach Modell kann
questionaireNamesList.getSelectedIndex()
legal zurückkehren entweder 2 oder -1. - zweite, Index # 2 gewählt. An diesem Punkt
questionaireNamesList.getSelectedIndex()
wird sicherlich 2 zurück.
So gibt es zwei gefeuert Veranstaltungen. Die Definition des Begriffs, wie diese Ereignisse erzeugt werden können Spielraum für unterschiedliche JVM-Implementierungen Dinge gehen etwas anders.
Hinweis: Sie sollten wahrscheinlich den Wert eines href überprüfen <= "http://java.sun.com/javase/6/docs/api/javax/swing/event/ListSelectionEvent.html#getValueIsAdjusting ()" rel = „noreferrer“> ListSelectionEvent#getValueIsAdjusting()
, um zu sehen, ob das Ereignis verarbeiten Sie ein in einer Reihe von Veranstaltungen ist. Sie müssen wahrscheinlich alle Ereignisse ignorieren, in dem diese true
zurück.
Andere Tipps
Im Anschluss an die Antwort von Eddie Blick auf die getValueIsAdjusting Methode auf das Ereignis.