2012-06-02 60 views
3

我一直在研究这个问题,但还没有找到让我满意的答案。 如您所知,当您在jtable中选择一行(通过单击)时,如果不使用!getValueIsAdjusting,则选择更改事件触发两次。如果您使用键盘箭头选择一行,则不会发生这种情况。要解决该问题,请检查getValueIsAdjusting是否返回false。getValueIsAdjusting到底做了什么?

我的问题是,如果我通过点击选择一行而不是使用键盘箭头时,事件触发两次? getValueIsAdjusting做什么来解决它?

感谢先进! :D

+2

你有至少阅读方法的javadoc,和setValueIsAdjusting的链接的javadoc( )?你在这个文档中不了解什么?我不明白它如何更清晰。 http://docs.oracle.com/javase/6/docs/api/javax/swing/event/ListSelectionEvent.html#getValueIsAdjusting%28%29 –

回答

10

由于JB Nizet链接到状态的javadocgetValueIsAdjusting()检查特定事件(更改)是否是链条的一部分,如果是,则返回true。当指定事件是链中的最后一个时,它将仅返回false

在你的情况下,通过点击选择一行实际上触发了两个事件:一个mouseDownmouseUp事件,并且两者都发送到你的事件监听器。如果您正确执行getValueIsAdjusting()以便在值为true时返回,那么您将只对链中的最后一个事件采取行动,即在放开鼠标左键时触发的mouseUp事件。

Java教程包括捕获事件的an example,您可以使用它来记录选择事件并自己进行实验。取消event.getValueIsAdjusting()检查的回报以记录每个被触发的事件。

+0

很好的解释;更多示例[此处](http://stackoverflow.com/a/10623134/230513)和[这里](http://stackoverflow.com/a/7519403/230513)。 – trashgod

+0

感谢您的解释。我现在明白了。但还有一件事情,为什么mouseDown和mouseUp,没有获得焦点和失去焦点? – CodeBlue

+0

nvm我现在明白了。谢谢你让我清楚:D – CodeBlue

0
String interessen[]= {"aaaaaaa", "bbbbbbbb", "ccccccccc", "ddddddd"}; 

    myList = new JList<>(interessen); 

    myList.addListSelectionListener(new ListSelectionListener() { 


     @Override 
     public void valueChanged(ListSelectionEvent e) { 
      if(!e.getValueIsAdjusting()) 
      System.out.println(myList.getSelectedValue()); 

     } 
    }); 

上面的代码显示了getValueIsAdjusting做了什么,没有这些方法可能会调用一个事件,例如。两次(这取决于事件)。

没有getValueIsAdjusting环路输出点击JList中的一些元素后: AAAAAAA AAAAAAA

与循环: AAAAAAA

相关问题