java - los - JList dispara valueChanged dos veces cuando se cambia un valor con el mouse
como cambiar el color de un boton en eclipse (2)
Recientemente encontré un error en java donde JList disparará el método valueChanged () dos veces cuando cambia un valor con el mouse, y solo una vez cuando cambia un valor con el teclado. Acabo de encontrar un error al respecto en el sitio web de Oracle (al parecer, el error tiene más de doce años ), y me pregunto si alguien puede explicarme por qué Oracle ha decidido que esto no es un defecto (por no mencionar que getValueIsAdjusting () devuelve false cuando se usa el teclado).
Para cualquier persona que tenga este problema, encontré que simplemente verificar si getValueIsAdjusting()
es falso, luego ejecutar el resto de mi método solucionará el problema.
Existe una solución simple:
private void jList1 ValueChanged(javax.swing.event.ListSelectionEvent evt) {
if (!evt.getValueIsAdjusting()) {//This line prevents double events
}
}
Hay una explicación simple.
Cuando aplica la selección con el mouse, realiza una lista de acciones:
1. Presiona el botón izquierdo del ratón en algún elemento
- list selecciona un elemento debajo del mouse y dispara el primer evento
- También aquí obtendrá getValueIsAdjusting = true ya que el mouse aún no está liberado
2. Puede arrastrar el mouse sin soltarlo para cambiar la selección
- la lista activará un evento adicional por cada cambio de selección realizado
- getValueIsAdjusting también será cierto para cada uno de esos eventos, ya que todavía estás haciendo cambios
3. Liberas el ratón.
- La lista activará el evento final. La operación de selección ha finalizado.
- getValueIsAdjusting = false ahora, puedes hacer lo que quieras con la selección final
Para resumir: esos eventos adicionales se activan 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 teclas, no sabrá si la va a cambiar después de presionar la primera tecla o no, por lo que getValueIsAdjusting siempre será falso para tales cambios.