7

いくつかのアイテムを含むJListがあります。リスト内のアイテムが選択されたときのリスナーを追加しました。リスト内のアイテムが選択されたときに何が起こるかについてのコードは次のとおりです。

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

上記のように、System.out.printステートメントを入力し、リスト内の何かをクリックするたびに、そのアイテムに対して2つの出力を取得します。

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

なぜこれが起こっているのか考えていますか?

ありがとう、パトリック

4

2 に答える 2

13

選択を変更すると、実装に応じて1つまたは2つのイベントが発生する可能性があります。インデックス#4を選択し、2番目の項目をクリックすると、次のようになります。

  • まず、インデックス#4は選択されていません。モデルに応じて、questionaireNamesList.getSelectedIndex()合法的に2または-1を返すことができます。
  • 次に、インデックス#2が選択されます。この時点で、questionaireNamesList.getSelectedIndex()必ず2が返されます。

したがって、2つのイベントが発生します。これらのイベントがどのように生成されるかを定義することで、さまざまなJVM実装の余裕が少し異なります。

注:おそらく、の値をチェックして、ListSelectionEvent#getValueIsAdjusting()処理しているイベントが一連のイベントの1つであるかどうかを確認する必要があります。おそらく、これがを返すすべてのイベントを無視する必要がありますtrue

于 2009-03-14T17:24:14.777 に答える
2

Eddieによる回答に加えて、イベントのgetValueIsAdjustingメソッドを見てください。

于 2009-03-14T17:33:28.060 に答える