2012-09-17 40 views
18

Recientemente encontré un error en java donde JList activará el método valueChanged() dos veces al cambiar un valor con el mouse, y solo una vez al cambiar un valor con el teclado. Acabo de encontrar a bug con respecto a esto en el sitio web de Oracle (aparentemente, el error es más de doce años), y me pregunto si alguien puede explicarme por qué Oracle ha decidido que esto no es un defecto (no mencionar que getValueIsAdjusting() devuelve falso cuando se usa el teclado).JList dispara valueChanged dos veces cuando se cambia un valor mediante mouse

Para cualquiera que tenga este problema, descubrí que simplemente comprobando cuando getValueIsAdjusting() es falso, y luego ejecutar el resto de mi método solucionará el problema.

+2

Véase también http://stackoverflow.com/a/12193333/1076463 – Robin

+1

¿Cuál es la pregunta aquí? –

+3

no es un error, es una característica ;-) En serio, es bien conocido (tos ... olvídalo yo mismo ocasionalmente) que la mayoría de las veces solo las notificaciones con! GetIsValueAdjusting son relevantes para el código de la aplicación. Además de eso, ¿de qué te quejas exactamente? – kleopatra

Respuesta

39

Hay una explicación simple.
Cuando se está solicitando la selección con el ratón se realiza una lista de acciones:

1. Pulse el botón izquierdo del ratón sobre un elemento
- lista selecciona un elemento debajo del ratón y los incendios primero evento
- también aquí obtendrá getValueIsAdjusting = cierto, ya que el ratón no se libera

2. es posible arrastrar el ratón sin soltarlo para cambiar la selección
- la lista se disparará un evento adicional por cada cambio de selección
hecho - getValueIsAdjusting será también cierto para cada uno de estos eventos ya que todavía está haciendo cambios

3. ratón liberación
- la lista se disparará el evento final - operación de selección ha terminado
- getValueIsAdjusting = falso ahora, puede hacer lo que quiera con la selección final

Para resumir: esos eventos adicionales se disparan para permitirle controlar completamente el comportamiento de la lista en los cambios de selección (en la secuencia de cambio de selección para ser exactos). Es posible que desee ignorar los cambios de selección cuando getValueIsAdjusting = true, ya que siempre habrá un evento final con getValueIsAdjusting = false que le informará que los cambios de selección han finalizado.

Además, cuando cambie la selección con la lista de botones de tecla, no sabría si va a cambiar después de presionar la primera tecla o no, por lo que getValueIsAdjusting siempre será falso para tales cambios.

+0

Eso lo explica bastante bien, gracias. – TGP1994

19

Hay una solución simple:

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

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

    } 

}          
Cuestiones relacionadas