Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带键盘的Java ListSelectionListener接口_Java_Swing_Jtable_Listselectionlistener - Fatal编程技术网

带键盘的Java ListSelectionListener接口

带键盘的Java ListSelectionListener接口,java,swing,jtable,listselectionlistener,Java,Swing,Jtable,Listselectionlistener,我已经实现了ListSelectionListener,您可以在下面看到,这样在选择第一个表中的特定行之后,第二个表就会相应地更新 class SelectionListener implements ListSelectionListener { public SelectionListener(){} @Override public void valueChanged(ListSelectionEvent e) { if (e.getS

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

}

是否有一种方法不仅在鼠标选择时调用侦听器,而且在通过键盘进行选择时调用侦听器?

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

list.addListSelectionListener(new ListSelectionListener() {
  public void valueChanged(ListSelectionEvent e) {
    System.out.println(list.getSelectedValue());
  }
});
是否有一种方法不仅在鼠标选择时调用侦听器,而且在通过键盘进行选择时调用侦听器

监听器将被触发,与选择更改的来源无关。是的,这是完全可能的,甚至是默认行为。因此,没有什么特别的事情必须做,以使这项工作

看看你的听众的代码,我建议把它改写成

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

出现这种不寻常体验的原因-没有通过键盘进行选择的通知-是针对键盘和鼠标触发的选择事件的值调整的细微不同设置:

  • 键盘触发的选择(即使使用修改器)仅触发一次(调整==false)
  • 鼠标触发的选择总是触发两次(第一次为true,第二次为false)
这一事实与不同寻常的逻辑结合在一起(这是@Robin发现的,+1对他来说:-)


(仅当选择正在调整时才作出反应)导致看不到键盘触发的更改

在内存中,只有用户按下空格键或enter键时,选择才会更改-未测试,只是利用我的早晨记忆-这意味着您在每次选择更改时调用侦听器之前不会收到选择更改事件,这和更改的低级触发器无关(鼠标、键盘、编程、操纵杆…)如果在代码中不起作用,则说明未显示的部分有问题。顺便说一句:在实际执行之前,不要忘记检查getValueIsAdjusting属性stuff@kleopatra该检查已完成(if语句中的最后一个条件),但检查结果与其他所有听众不同,可能可以解释问题。我将这句话包括在我的报告中answer@Robin为我懒得滚动而感到羞耻;-)你说与其他人不同是什么意思?@kleopatra通常你什么都不做,直到
getValueIsAdjusting
返回
false
。在这个if检查中,代码仅在值正在调整时触发,这是因为您没有检查e.getValueIsAdjusting())==true。忽略此项时,每个事件都会发生两次。@一旦您想检查
e.getValueIsAdjusting()==false
而不是
true
。请参阅我的答案+1,以更好地解释原因。我只是假设这是导致问题的原因,现在我也知道了原因,我改为&&e.getValueIsAdjusting()==false,它解决了问题。
if (e.getSource() == myTrumpsAndMessages.jTable1.getSelectionModel() 
        && myTrumpsAndMessages.jTable1.getRowSelectionAllowed()
        // typo/misunderstanding or feature? doing stuff only when adjusting 
        && e.getValueIsAdjusting())