带有键盘的Java 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); } } } 

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

不寻常体验的原因 – 没有通过键盘选择的通知 – 是一个微妙的不同设置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()) 

(仅在选择调整时作出反应)导致没有看到键盘触发的变化。

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

将独立于选择更改的来源触发侦听器。 所以是的,这是完全可能的,甚至是默认行为。 因此,必须采取一些特殊措施来实现这一目标。

看一下你的监听器的代码,我建议把它改写成

 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时,方法会快速中断,因为这是大多数情况下您想要的行为。

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

 list.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { System.out.println(list.getSelectedValue()); } });