我最近遇到了一个java中的错误,当使用鼠标更改值时,JList将触发valueChanged()方法两次,而使用键盘更改值时只会触发一次。我刚刚在甲骨文的网站上发现了a bug(显然,这个错误超过 十二岁 ),我想知道是否有人可以解释我为什么Oracle已经确定这不是缺陷(更不用说getValueIsAdjusting()在使用键盘时返回false)。
对于遇到此问题的任何人,我发现只需检查getValueIsAdjusting()
何时为假,然后运行其余方法就可以解决问题。
答案 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
}
}