2012-09-17 11 views
18

Ich habe kürzlich einen Fehler in Java gefunden, wo JList die valueChanged() -Methode zweimal beim Ändern eines Wertes mit der Maus und nur einmal beim Ändern eines Wertes mit der Tastatur auslöst. Ich habe gerade a bug diesbezüglich auf der Website von Oracle (anscheinend ist der Fehler mehr als zwölf Jahre alt) gefunden, und ich frage mich, wenn jemand mir erklären kann, warum Oracle entschieden hat, dass dies kein Defekt ist (nicht zu erwähnen, dass getValueIsAdjusting() false zurückgibt, wenn die Tastatur verwendet wird).JList feuert valueChanged zweimal, wenn ein Wert per Maus geändert wird

Für alle, die dieses Problem haben, fand ich, dass einfach zu überprüfen, wenn getValueIsAdjusting() falsch ist, dann wird der Rest meiner Methode um das Problem herumlaufen.

+2

Siehe auch http://stackoverflow.com/a/12193333/1076463 – Robin

+1

Was ist hier die Frage? –

+3

es ist kein Fehler, es ist eine Funktion ;-) Im Ernst, es ist bekannt (Husten .. vergessen Sie es gelegentlich selbst), dass die meiste Zeit nur Benachrichtigungen mit! GetIsValueAdjusting für Anwendungscode relevant sind. Abgesehen davon, worüber genau beschwerst du dich? – kleopatra

Antwort

39

Es gibt eine einfache Erklärung.
Wenn Sie die Auswahl mit der Maus anwenden führen Sie eine Liste von Aktionen:

1. Drücken Sie die linke Maustaste auf ein Element
- auch hier - Liste ein Element unter der Maus und Brände erste Ereignis wählt
Sie erhalten getValueIsAdjusting = true, da die Maus noch nicht

2. freigegeben wird, könnten Sie die Maus ziehen, ohne Loslassen Auswahl
ändern - ein zusätzliches Ereignis für jede Auswahl Änderungsliste wird Feuer gemacht
- getValueIsAdjusting wird für jedes dieser Ereignisse auch wahr sein, da Sie noch Änderungen sind

3. Sie Release Maus
- Liste des letzten Ereignis wird ausgelöst - Auswahlvorgang beendet ist
- getValueIsAdjusting = jetzt können Sie mit der Endauswahl alles machen, was Sie wollen.

Zusammenfassen - diese zusätzlichen Ereignisse werden ausgelöst, damit Sie das Listenverhalten bei Auswahländerungen vollständig steuern können (bei der Auswahl, um genau zu sein). Vielleicht möchten Sie die Auswahländerungen ignorieren, wenn getValueIsAdjusting = true ist, da es immer ein finales Ereignis mit getValueIsAdjusting = false geben wird, das Sie darüber informiert, dass die Auswahländerungen abgeschlossen sind.

Wenn Sie die Auswahl mit den Tasten ändern, weiß die Liste nicht, ob Sie sie nach dem ersten Drücken der Taste ändern wollen, daher wird getValueIsAdjusting für solche Änderungen immer falsch sein.

+0

Das erklärt es ziemlich gut, danke. – TGP1994

19

Es gibt eine einfache Lösung:

private void jList1 ValueChanged(javax.swing.event.ListSelectionEvent evt) { 

    if (!evt.getValueIsAdjusting()) {//This line prevents double events 

    } 

}