当通过鼠标更改值时,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 事件