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

Posted

技术标签:

【中文标题】当通过鼠标更改值时,JList 会触发 valueChanged 两次【英文标题】:JList fires valueChanged twice when a value is changed via mouse 【发布时间】:2012-09-09 19:25:06 【问题描述】:

我最近在 java 中遇到了一个错误,其中 JList 在使用鼠标更改值时会触发 valueChanged() 方法两次,而在使用键盘更改值时只会触发一次。我刚刚在 Oracle 的网站上找到了 a bug 与此相关的内容(显然,该错误已超过 12 岁),我想知道是否有人可以向我解释原因Oracle 已确定这不是缺陷(更不用说使用键盘时 getValueIsAdjusting() 返回 false)。

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

【问题讨论】:

另见***.com/a/12193333/1076463 这不是一个错误,它是一个特性 ;-) 说真的,众所周知(咳嗽..我自己偶尔会忘记它)大多数时候只有带有 !getIsValueAdjusting 的通知与应用程序代码相关.除此之外,你到底在抱怨什么? 【参考方案1】:

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

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

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

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

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

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

【讨论】:

【参考方案2】:

有一个简单的解决方案:

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

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

    

                                     

【讨论】:

以上是关于当通过鼠标更改值时,JList 会触发 valueChanged 两次的主要内容,如果未能解决你的问题,请参考以下文章

通过 ngModel Binding 设置值时如何在 textarea 上触发更改事件

以编程方式更改值时触发 Dojo Select onChange 事件

Javascript:在onkeyup事件中更改值时不会触发onchange事件[重复]

如何手动触发 onchange 事件? [复制]

如何手动触发 onchange 事件? [复制]

当属性更改值时,在 C# Windows 窗体中定义事件[重复]