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

时间:2012-09-17 14:38:45

标签: java swing jlist java-7 listselectionlistener

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

对于遇到此问题的任何人,我发现只需检查getValueIsAdjusting()何时为假,然后运行其余方法就可以解决问题。

2 个答案:

答案 0 :(得分:43)

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

<强> 1。在某个元素上按鼠标左键
- list选择鼠标下的元素并触发第1个事件
- 在这里你将获得getValueIsAdjusting = true,因为鼠标尚未发布

<强> 2。您可以拖动鼠标而不释放它以更改选择
- 列表将针对每个选择更改发出附加事件 - 由于您仍在进行更改,因此每个事件的getValueIsAdjusting也是如此

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

总结一下 - 这些额外的事件被触发,让你完全控制选择变化的列表行为(准确地说是选择变更序列)。当getValueIsAdjusting = true时,您可能希望忽略选择更改,因为始终会有getValueIsAdjusting = false的最终事件,它将通知您选择更改已完成。

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

答案 1 :(得分:22)

有一个简单的解决方案:

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

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

    }

}