2012-08-29 28 views
7

He implementado ListSelectionListener como puede ver a continuación, de modo que después de que se elija una línea específica en la primera tabla, la segunda tabla se actualice en consecuencia.Interfaz de Java ListSelectionListener con teclado

class SelectionListener implements ListSelectionListener { 

    public SelectionListener(){} 

    @Override 
    public void valueChanged(ListSelectionEvent e) 
    { 
     if (e.getSource() == myTrumpsAndMessages.jTable1.getSelectionModel() 
      && myTrumpsAndMessages.jTable1.getRowSelectionAllowed() 
      && e.getValueIsAdjusting()) 
     { 
      int selected = myTrumpsAndMessages.jTable1.getSelectedRow(); 
      clearjTable(jTable4); 
      showSubscribers(selected); 
     } 
    } 

} 

¿Hay una manera de invocar el oyente no sólo cuando el ratón es elegir, sino también cuando la elección se está haciendo desde el teclado?

+0

Desde la memoria, la selección no puede cambiar hasta que el usuario presione el espacio o ingrese - no probado, solo trabajando en mi memoria matutina - esto significa que no recibirá eventos de selección cambiados hasta entonces – MadProgrammer

+0

el oyente se invoca cada vez que se selecciona cambiado, independientemente del disparador de bajo nivel para el cambio (mouse, teclado, programática, joystick ...) Si eso no funciona en su código, algo está mal en la parte que no muestra. Por cierto: no te olvides de verificar la propiedad getValueIsAdjusting antes de hacer realmente las cosas – kleopatra

+1

@kleopatra que se realiza el chequeo (última condición en la declaración if), pero la verificación es diferente en todos los demás oyentes y podría explicar el problema. Incluí esta observación en mi respuesta – Robin

Respuesta

7

La razón de la experiencia inusual - falta de notificación por la selección a través del teclado - es un entorno diferente sutil de valueIsAdjusting para el teclado frente a eventos de selección ratón activados por:

  • teclado desencadenó la selección (incluso con modificadores) solamente incendios vez (con ajuste == false)
  • ratón activan selección siempre se dispara dos veces (primero con cierto, segundo con falso)

Ese hecho combina con la lógica inusual (que @Robin manchado, 1 a él :-)

if (e.getSource() == myTrumpsAndMessages.jTable1.getSelectionModel() 
     && myTrumpsAndMessages.jTable1.getRowSelectionAllowed() 
     // typo/misunderstanding or feature? doing stuff only when adjusting 
     && e.getValueIsAdjusting()) 

(reaccionar sólo si la selección es ajuste) lleva a no ver el teclado provocó cambios.

+0

+1 para una mejor explicación de por qué. Solo asumí que eso estaba causando el problema, ahora también sé por qué – Robin

+1

Gracias, cambié a && e.getValueIsAdjusting() == false y resolvió el problema. – Onca

1

Acabo de probar un ListSelectionListener y el evento valueChanged() en realidad se está activando en el cambio de selección de teclado también. Ver mi ejemplo a continuación:

list.addListSelectionListener(new ListSelectionListener() { 
    public void valueChanged(ListSelectionEvent e) { 
    System.out.println(list.getSelectedValue()); 
    } 
}); 
+0

Por supuesto, eso es porque no has verificado que e.getValueIsAdjusting()) == true. cuando omites esto, cada evento ocurre dos veces. – Onca

+1

@Onca es probable que desee comprobar 'e.getValueIsAdjusting() == false' en lugar de' true'. Ver mi respuesta – Robin

+0

Tienes razón. Gracias. – Onca

5

¿Hay una manera de invocar el oyente no sólo cuando el ratón es elegir, sino también cuando la elección se está haciendo desde el teclado?

El detector se activará, independientemente del origen del cambio de selección. Entonces sí, esto es perfectamente posible e incluso el comportamiento predeterminado. Por lo tanto, no se debe hacer nada especial para que esto funcione.

Mirando el código de su oyente, sugeriría volver a escribir a

class SelectionListener implements ListSelectionListener { 
    public SelectionListener(){} 
    @Override 
    public void valueChanged(ListSelectionEvent e){ 
    if (e.getValueIsAdjusting()){ 
     return; 
    } 
    if (e.getSource() == myTrumpsAndMessages.jTable1.getSelectionModel() && 
     myTrumpsAndMessages.jTable1.getRowSelectionAllowed()) { 
     int selected = myTrumpsAndMessages.jTable1.getSelectedRow(); 
     clearjTable(jTable4); 
     showSubscribers(selected); 
    } 
    } 
} 

Nota de la ruptura rápida del método cuando getValueIsAdjusting() vuelve true ya que este es el comportamiento que desea en la mayoría de los casos.

+0

+1 para detectar la lógica inusual :-) – kleopatra