Java 当通过鼠标更改值时,JList将激发valueChanged两次

Java 当通过鼠标更改值时,JList将激发valueChanged两次,java,swing,jlist,java-7,listselectionlistener,Java,Swing,Jlist,Java 7,Listselectionlistener,我最近在java中遇到了一个错误,JList在使用鼠标更改值时会触发valueChanged()方法两次,在使用键盘更改值时只触发一次。我刚刚在Oracle的网站上发现了这个问题(显然,这个bug已经存在了12年了),我想知道是否有人能向我解释为什么Oracle认为这不是一个缺陷(更不用说使用键盘时getValueIsAdjusting()返回false) 对于任何有此问题的人,我发现只要检查whengetValueIsAdjusting()为false,然后运行我的方法的其余部分就可以解决此问

我最近在java中遇到了一个错误,JList在使用鼠标更改值时会触发valueChanged()方法两次,在使用键盘更改值时只触发一次。我刚刚在Oracle的网站上发现了这个问题(显然,这个bug已经存在了12年了),我想知道是否有人能向我解释为什么Oracle认为这不是一个缺陷(更不用说使用键盘时getValueIsAdjusting()返回false)


对于任何有此问题的人,我发现只要检查when
getValueIsAdjusting()
为false,然后运行我的方法的其余部分就可以解决此问题。

有一个简单的解释。
使用鼠标应用选择时,将执行一系列操作:

1。在某些元素上按鼠标左键
-列表选择鼠标下的元素并触发第一个事件
-由于鼠标尚未释放,因此在这里您将获得getValueIsAdjusting=true

2。您可以在不释放鼠标的情况下拖动鼠标以更改选择
-列表将为每个选择更改触发一个附加事件
-getValueIsAdjusting对于这些事件中的每一个都是正确的,因为您仍在进行更改

3。您可以释放鼠标
-列表将触发最终事件-选择操作完成
-getValueIsAdjusting=false现在,您可以对最终选择执行任何操作

总而言之,触发这些附加事件是为了让您完全控制选择更改时的列表行为(确切地说是选择更改顺序)。当getValueIsAdjusting=true时,您可能希望忽略选择更改,因为始终存在getValueIsAdjusting=false的最终事件,该事件将通知您选择更改已完成


此外,当您使用按键更改选择时,列表不知道您是否要在第一次按键后更改它,因此getValueIsAdjusting对于此类更改将始终为false。

有一个简单的解决方案:

private void jList1 ValueChanged(javax.swing.event.ListSelectionEvent evt) { 

    if (!evt.getValueIsAdjusting()) {//This line prevents double events

    }

}                                     

还要看到,这不是一个bug,而是一个特性;-)说真的,众所周知(咳嗽..我自己偶尔忘了它)大多数时候只会通知!getIsValueAdjusting与应用程序代码相关。除此之外,你到底在抱怨什么?