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

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

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

【问题讨论】:

  • 这不是一个错误,它是一个特性 ;-) 说真的,众所周知(咳嗽..我自己偶尔会忘记它)大多数时候只有带有 !getIsValueAdjusting 的通知与应用程序代码相关.除此之外,你到底在抱怨什么?

标签: java swing jlist java-7 listselectionlistener


【解决方案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
    
        }
    
    }                                     
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      相关资源
      最近更新 更多