Domanda

Ho una JList con alcuni elementi. Ho aggiunto un listener per quando viene selezionato un elemento nell'elenco. Ecco il codice per ciò che accade quando viene selezionato un elemento nell'elenco:

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 puoi sopra ho inserito un'istruzione System.out.print e ogni volta che faccio clic su qualcosa nell'elenco, ottengo due uscite per quell'elemento, ad es.

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

Qualche idea sul perché questo accada?

Grazie, Patrick

È stato utile?

Soluzione

Quando si modifica una selezione, possono verificarsi uno o due eventi, 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 n. 2 è SELEZIONATO. A questo punto, questionaireNamesList.getSelectedIndex () restituirà sicuramente 2.

Quindi, ci sono due eventi generati. La definizione di come vengono generati questi eventi consente un margine di manovra per le diverse implementazioni JVM che vanno leggermente diversamente.

NOTA: probabilmente dovresti controllare il valore di ListSelectionEvent # getValueIsAdjusting () per vedere se l'evento che stai elaborando fa parte di una serie di eventi. Probabilmente dovrai ignorare tutti gli eventi in cui questo restituisce true .

Altri suggerimenti

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top