8

以下に示すように ListSelectionListener を実装したので、最初のテーブルの特定の行が選択された後、それに応じて 2 番目のテーブルが更新されます。

class SelectionListener implements ListSelectionListener {

    public SelectionListener(){}

    @Override
    public void valueChanged(ListSelectionEvent e) 
    {
        if (e.getSource() == myTrumpsAndMessages.jTable1.getSelectionModel() 
            && myTrumpsAndMessages.jTable1.getRowSelectionAllowed()
            && e.getValueIsAdjusting()) 
        {
          int selected = myTrumpsAndMessages.jTable1.getSelectedRow();
            clearjTable(jTable4);
            showSubscribers(selected);
        }
    }

}

マウスが選択しているときだけでなく、キーボードから選択されているときにもリスナーを呼び出す方法はありますか?

4

3 に答える 3

9

異常なエクスペリエンス (キーボードによる選択に関する通知がない) の理由は、キーボードとマウスでトリガーされた選択イベントの valueIsAdjusting の設定が微妙に異なるためです。

  • キーボードでトリガーされた選択 (モディファイアがあっても) は 1 回だけ実行されます (調整 == false を使用)
  • マウス トリガーによる選択は常に 2 回発生します (1 回目は true、2 回目は false)。

その事実は、異常な論理と組み合わされています(@Robinが見つけた、彼に+1 :-)

if (e.getSource() == myTrumpsAndMessages.jTable1.getSelectionModel() 
        && myTrumpsAndMessages.jTable1.getRowSelectionAllowed()
        // typo/misunderstanding or feature? doing stuff only when adjusting 
        && e.getValueIsAdjusting()) 

(選択が調整されている場合にのみ反応する)と、キーボードでトリガーされた変更が表示されなくなります。

于 2012-08-30T08:58:47.577 に答える
5

マウスが選択しているときだけでなく、キーボードから選択されているときにもリスナーを呼び出す方法はありますか?

選択変更のソースに関係なく、リスナーがトリガーされます。はい、これは完全に可能であり、デフォルトの動作ですらあります。したがって、これを機能させるために特別なことをする必要はありません。

リスナーのコードを見て、次のように書き直すことをお勧めします。

class SelectionListener implements ListSelectionListener {
  public SelectionListener(){}
  @Override
  public void valueChanged(ListSelectionEvent e){
    if ( e.getValueIsAdjusting() ){
       return;
    }
    if (e.getSource() == myTrumpsAndMessages.jTable1.getSelectionModel() && 
        myTrumpsAndMessages.jTable1.getRowSelectionAllowed() ) {
      int selected = myTrumpsAndMessages.jTable1.getSelectedRow();
      clearjTable(jTable4);
      showSubscribers(selected);
    }
  }
}

ほとんどの場合、これが必要な動作であるため、getValueIsAdjusting()返されるときにメソッドからのクイックブレークに注意してください。true

于 2012-08-30T08:18:27.923 に答える
1

試してみましたがListSelectionListenervalueChanged()実際にはキーボード選択の変更時にもイベントがトリガーされています。以下の私の例を参照してください。

list.addListSelectionListener(new ListSelectionListener() {
  public void valueChanged(ListSelectionEvent e) {
    System.out.println(list.getSelectedValue());
  }
});
于 2012-08-29T20:38:21.880 に答える