8

我已经实现了 ListSelectionListener ,如下所示,因此在选择第一个表中的特定行后,第二个表会相应更新。

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 的细微不同设置,用于键盘与鼠标触发的选择事件:

  • 键盘触发选择(即使使用修饰符)仅触发一次(调整 == 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

我刚刚尝试过ListSelectionListener,并且valueChanged()事件实际上也是在键盘选择更改时触发的。请参阅下面的示例:

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