2009-03-14 19 views
7

Ho una JList con alcuni elementi. Ho aggiunto un listener per quando un elemento nell'elenco è selezionato. Ecco il codice per ciò che accade quando si seleziona una voce nella lista:Perché le selezioni JList si verificano due volte?

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(); 
    } 
} 

Come potete sopra ho messo una dichiarazione System.out.print e ogni volta che clicco su qualcosa nella lista ottengo due delle uscite di quell'elemento , per esempio.

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

Qualsiasi idea del perché questo sta accadendo?

Grazie, Patrick

risposta

13

Quando si cambia una selezione, uno o due eventi possono verificarsi, a seconda dell'implementazione. Se si seleziona l'indice n. 4 e si fa clic sul secondo elemento, si verifica quanto segue:

  • Innanzitutto, l'indice n. 4 è NON SELEZIONATO. A seconda del modello, questionaireNamesList.getSelectedIndex() può restituire legalmente 2 o -1.
  • secondo, l'indice # 2 è SELEZIONATO. A questo punto, questionaireNamesList.getSelectedIndex() restituirà sicuramente 2.

Pertanto, sono stati attivati ​​due eventi. La definizione di come vengono generati questi eventi consente un margine di manovra per le diverse implementazioni JVM e le cose vanno leggermente diversamente.

NOTA: è consigliabile controllare il valore di ListSelectionEvent#getValueIsAdjusting() per verificare se l'evento che si sta elaborando è uno di una serie di eventi. Probabilmente devi ignorare tutti gli eventi in cui questo restituisce true.

+0

Se l'indice 4 non è selezionato, perché getSelectedIndex() restituisce 4 e non -1? –

+0

Ho modificato la mia risposta per spiegare. – Eddie

+0

Si dice che se l'indice # 4 è NON SELEZIONATO può restituire legalmente 2 o -1. Perché 2? –

2

Oltre alla risposta di Eddie, esaminare il metodo getValueIsAdjusting sull'evento.

Problemi correlati