带有键盘的Java ListSelectionListener接口

Onc*_*nca 7 java swing jtable listselectionlistener

我已经实现了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);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

有没有办法在鼠标选择时调用监听器,还有从键盘选择的时候?

kle*_*tra 8

不寻常体验的原因 - 没有通过键盘选择的通知 - 是一个微妙的不同设置valueIsAdjusting键盘与鼠标触发的选择事件:

  • 键盘触发选择(即使使用修饰符)仅触发一次(调整== false)
  • 鼠标触发选择总是触发两次(第一次使用true,第二次使用false)

这个事实加上了不同寻常的逻辑(@Robin发现,+1给他:-)

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

(仅当选择反应调整)导致没有看到键盘引起的变化.

  • 谢谢,我改为 && e.getValueIsAdjusting()==false 并解决了问题。 (2认同)

Rob*_*bin 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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意getValueIsAdjusting()返回时从方法快速中断,true因为这是大多数情况下您想要的行为.