2012-09-17 7 views
18

Niedawno napotkałem błąd w java, gdzie JList będzie wywoływał metodę valueChanged() dwa razy podczas zmiany wartości za pomocą myszy i tylko raz przy zmianie wartości za pomocą klawiatury. Właśnie znalazłem a bug w odniesieniu do tego na stronie internetowej Oracle (podobno błąd jest więcej niż dwanaście lat), i zastanawiam się, czy ktoś może mi wyjaśnić, dlaczego Oracle zdecydował, że to nie jest wada (nie wspomnieć, że getValueIsAdjusting() zwraca wartość false, gdy używana jest klawiatura).JList odpala wartośćChanged dwa razy, gdy wartość jest zmieniana za pomocą myszy

Dla każdego, kto ma ten problem, stwierdziłem, że po prostu sprawdzam, kiedy getValueIsAdjusting() jest fałszywe, a następnie reszta mojej metody obejmie problem.

+2

zobaczyć również http://stackoverflow.com/a/12193333/1076463 – Robin

+1

Co się tutaj pytanie? –

+3

to nie jest błąd, to funkcja ;-) Poważnie, jest dobrze znana (kaszle .. zapomnij o tym od czasu do czasu), że większość czasu tylko powiadomienia z! GetIsValueAdjusting są istotne dla kodu aplikacji. Poza tym, na co dokładnie narzekasz? – kleopatra

Odpowiedz

39

Istnieje proste wyjaśnienie.
Gdy ubiegasz wybór myszką wykonać listę działań:

1. Naciśnij lewy przycisk myszy na jakiegoś elementu
- lista wybiera element pod myszy i pożary 1st imprezy
- także tutaj dostaniesz getValueIsAdjusting = true, ponieważ mysz nie została jeszcze wydana

2. można przeciągać myszą nie zwalniając go, aby zmienić wybór
- lista zostanie wyzwolony dodatkowy wydarzenie dla każdej zmianie wyboru wykonane
- getValueIsAdjusting będzie również prawdziwe w odniesieniu do każdego z tych wydarzeń, ponieważ jesteś nadal dokonywania zmian

3. Ty mysz uwolnienie
- lista będzie ogień ostateczny wydarzenie - operacja wyboru jest zakończone
- getValueIsAdjusting = Fałszywe teraz, możesz zrobić, co chcesz z ostatecznym wyborem

Podsumowując - te dodatkowe zdarzenia są uruchamiane, aby pozwolić ci całkowicie kontrolować zachowanie listy podczas zmian wyboru (dokładnie w kolejności zmiany wyboru). Możesz zignorować zmiany wyboru, gdy getValueIsAdjusting = true, ponieważ zawsze będzie ostatnie zdarzenie z getValueIsAdjusting = false, które poinformuje cię, że zmiany wyboru zostały zakończone.

Ponadto, po zmianie wyboru za pomocą przycisków przycisków lista nie będzie wiedziała, czy zamierzasz go zmienić po pierwszym naciśnięciu klawisza, czy nie, więc funkcja getValueIsAdjusting będzie zawsze fałszywa w przypadku takich zmian.

+0

To wyjaśnia to całkiem dobrze, dziękuję. – TGP1994

19

Istnieje proste rozwiązanie:

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

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

    } 

}          
Powiązane problemy