4

独自のイベント ハンドラーを実装し、それをテーブルの選択モデルに追加しました。

table.getSelectionModel().addListSelectionListener(event);

そして、「イベント」のメソッドを実装しました(上記):

public void valueChanged(ListSelectionEvent e) {
    log.debug("value changed");
}

残念ながら、e.getSource が javax.swing.DefaultListSelectionModel を提供しているため、選択した可能性があり、関連付けられたテーブルを見つけることができない場合、イベントが 2 回発生します。

したがって、私の質問は次のとおりです。

1) eventListener が 1 回しか登録されていないのに、なぜ 2 回起動するのですか?

2) 選択が適用されるテーブルを見つけるにはどうすればよいですか? DefaultListSelectionModel は getSource() などを提供していないようです。

どうもありがとう!

4

3 に答える 3

12

ありがとうDraemon..それはうまくいきます....

私たちのコード

vMachinesTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

    public void valueChanged(ListSelectionEvent lse) {
        if (!lse.getValueIsAdjusting()) {
            System.out.println("Selection Changed");
        }
    }
});

ありがとう

TFチーム

于 2012-04-17T06:30:44.260 に答える
6

1)古い選択を選択解除するために1回、新しい選択を選択するために1回起動することがわかると思います。イベントの詳細をログに記録すると、何が起こっているのかが正確にわかるはずです。詳細は覚えていないので、間違っているかもしれません。いずれにしても、イベントで getValueIsAdjusting() を呼び出して、チェーンの最後のイベントのみを使用できるようにする必要があります (つまり、false が返された場合)。

2)通常は必要ありませんが、これを行う唯一の方法は、テーブル専用のリスナーを作成することです(つまり、テーブルをコンストラクターに渡し、それを記憶します)。

于 2008-12-17T17:19:45.330 に答える
3

複数の JTable (または私が推測する他のコンポーネント) が同じ選択モデルを共有できるため、関連付けられた JTable をイベントから要求しても意味がありません。これは、TableModel から JTable を取得できないのと同じ理由です。Draemon が提案するように、JTable への参照をリスナー クラスに格納します (またはアクセスできるようにします)。

于 2008-12-17T19:09:15.577 に答える