JList 触发值当通过鼠标更改值时更改两次

我最近在java中遇到了一个错误,其中JList在使用鼠标更改值时会触发valueChanged()方法两次,并且在使用键盘更改值时只会触发一次。我刚刚在Oracle的网站上发现了个关于这个的错误(显然,这个错误已经超过十二年了),我想知道是否有人可以向我解释为什么Oracle决定这不是一个缺陷(更不用说getValueIsAdjusting()在使用键盘时返回false)。

对于遇到此问题的任何人来说,我发现简单地检查何时是错误的,然后运行我的方法的其余部分就可以解决问题。getValueIsAdjusting()


答案 1

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

1.在某些元素上按鼠标左键 - 列表选择鼠标下方的元素并触发第1个事件
- 在这里你也会得到getValueIsAdjusting=true,因为鼠标尚未释放

2.您可以拖动鼠标而不释放它来更改选择
- 列表将为所做的
每个选择更改触发一个附加事件 - getValueIsAdsting对于每个事件也将为真,因为您仍在进行更改

3. 您释放鼠标
- 列表将触发最终事件
- 选择操作已完成 - getValueIsAdjusting=false 现在,您可以通过最终选择做任何你想做的事情

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

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


答案 2

有一个简单的解决方案:

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

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

    }

}                                     

推荐