2009-03-14 20 views
7

Tengo una lista J con algunos artículos. He agregado un oyente para cuando se selecciona un elemento en la lista. Aquí está el código de lo que sucede cuando se selecciona un elemento de la lista:¿Por qué las selecciones JList ocurren dos veces?

private void questionaireNamesListValueChanged(ListSelectionEvent evt) { 
    try { 
     inputPanel.setEnabled(false); 
     inputPanel.setVisible(false); 
     inputTextField.setText(""); 
     inputStatusLabel.setText(""); 
     int questionaireIndex = questionaireNamesList.getSelectedIndex(); 

     // Why will this be printed twice? 
     System.out.println("Questionaire Index: " + questionaireIndex); 

     if (remoteQuestionServer.getQuestionCount(questionaireIndex) == 5) { 
      answerQuestionButton.setEnabled(true); 
      addQuestionButton.setEnabled(false); 
     } else { 
      addQuestionButton.setEnabled(true); 
      answerQuestionButton.setEnabled(false); 
     } 
    } catch (RemoteException ex) { 
     ex.printStackTrace(); 
    } 
} 

Como se puede anterior puse una declaración System.out.print y cada vez que hago clic en algo en la lista consigo dos ouputs de ese elemento , p.ej.

Questionaire Index: 4 
Questionaire Index: 4 
Questionaire Index: 2 
Questionaire Index: 2 
Questionaire Index: 0 
Questionaire Index: 0 
Questionaire Index: 2 
Questionaire Index: 2 

Alguna idea de por qué ocurre esto?

Gracias, Patrick

Respuesta

13

Al cambiar una selección, uno o dos eventos pueden ocurrir, dependiendo de la aplicación. Si se selecciona el índice # 4 y hace clic en el segundo elemento, ocurre lo siguiente:

  • Primero, el índice 4 no está SELECCIONADO. Según el modelo, questionaireNamesList.getSelectedIndex() puede devolver legalmente 2 o -1.
  • segundo, el índice n. ° 2 está SELECCIONADO. En este punto, questionaireNamesList.getSelectedIndex() seguramente devolverá 2.

Por lo tanto, hay dos eventos activados. La definición de cómo se generan estos eventos permite el margen de maniobra para que las diferentes implementaciones de JVM hagan las cosas de forma ligeramente diferente.

NOTA: Probablemente debería verificar el valor de ListSelectionEvent#getValueIsAdjusting() para ver si el evento que está procesando es uno de una serie de eventos. Probablemente necesites ignorar todos los eventos donde esto devuelve true.

+0

Si el índice 4 no está seleccionado, ¿por qué getSelectedIndex() devuelve 4 y no -1? –

+0

Edité mi respuesta para explicar. – Eddie

+0

Usted dice que si el índice n. ° 4 no está SELECCIONADO, puede devolver legalmente 2 o -1. ¿Por qué 2? –

2

Además de la respuesta de Eddie, mire el método getValueIsAdjusting en el evento.

Cuestiones relacionadas