26

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

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

4

2 回答 2

50

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

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

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

3. 你松开鼠标
- 列表将触发最终事件 - 选择操作完成
- 现在 getValueIsAdjusting=false,你可以对最终选择做任何你想做的事情

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

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

于 2012-09-17T14:53:58.587 回答
32

有一个简单的解决方案:

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

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

    }

}                                     
于 2014-08-22T13:52:40.657 回答