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