2012-09-17 14 views
18

Recentemente ho riscontrato un errore in java in cui JList eseguirà il metodo valueChanged() due volte quando si modifica un valore con il mouse e solo una volta quando si modifica un valore con la tastiera. Ho appena trovato a bug riguardo a questo sul sito Web di Oracle (a quanto pare, il bug è più di dodici anni), e mi chiedo se qualcuno può spiegarmi perché Oracle ha deciso che questo non è un difetto (non per dire che getValueIsAdjusting() restituisce false quando si usa la tastiera).JList genera valoreCambiato due volte quando un valore viene modificato tramite il mouse

Per chiunque abbia riscontrato questo problema, ho trovato che è sufficiente verificare quando getValueIsAdjusting() è falso, quindi il resto del mio metodo risolverà il problema.

+2

anche vedere http://stackoverflow.com/a/12193333/1076463 – Robin

+1

Qual è la domanda? –

+3

non è un bug, è una caratteristica ;-) Scherzi a parte, è risaputo (tosse .. me ne dimentichi occasionalmente) che la maggior parte delle volte solo le notifiche con! GetIsValueAdjusting sono rilevanti per il codice dell'applicazione. Oltre a questo, di cosa ti lamenti esattamente? – kleopatra

risposta

39

C'è una spiegazione semplice.
Quando si sta applicando la selezione con il mouse si esegue un elenco di azioni:

1. Premere il tasto sinistro del mouse su qualche elemento
- elenco seleziona un elemento sotto il mouse e gli incendi primo evento
- anche qui si otterrà getValueIsAdjusting = true dal momento che il mouse non è ancora stata rilasciata

2. si potrebbe trascinare il mouse senza rilasciare per cambiare la selezione
- elenco sarà generare un evento aggiuntivo per ogni cambio di selezione made
- getValueIsAdjusting sarà vero anche per ciascuno di questi eventi in quanto si sta ancora facendo i cambiamenti

3. È il mouse rilascio
- elenco scatterà l'evento finale - operazione di selezione è terminata
- getValueIsAdjusting = false ora, puoi fare tutto ciò che vuoi con la selezione finale

Per riassumere: quegli eventi aggiuntivi vengono attivati ​​per consentire di controllare completamente il comportamento dell'elenco sui cambiamenti di selezione (sulla sequenza di modifica della selezione per l'esattezza). Potresti voler ignorare le modifiche alla selezione quando getValueIsAdjusting = true poiché ci sarà sempre un evento finale con getValueIsAdjusting = false che ti informerà che le modifiche alla selezione sono finite.

Inoltre, quando si cambia la selezione con la lista tasti chiave non so se avete intenzione di cambiare dopo la prima pressione di un tasto o meno, quindi getValueIsAdjusting sarà sempre false per tali cambiamenti.

+0

Questo lo spiega abbastanza bene, grazie. – TGP1994

19

C'è una soluzione semplice:

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

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

    } 

}          
Problemi correlati