【问题标题】:Call itemStateChanged() only after user interaction仅在用户交互后调用 itemStateChanged()
【发布时间】:2012-04-26 08:40:57
【问题描述】:

在我的 Swing 应用程序中,我有一个带有 ItemListener 的组合框,如果用户更改值(通过 itemStateChanged()),它会执行 X。 但是,我还有一个不同的函数可以更改该组合框的值。在这种情况下,我不希望 X 完成。

有没有办法找出状态变化是由用户交互还是由函数引起的?

谢谢!

编辑:我使用了标志方法。感谢您的快速回答。我只想补充一点,itemStatechanged 实际上被调用了两次,一次用于取消选择,一次用于选择。这需要处理,否则标志不会有任何影响。问题在here讨论。

【问题讨论】:

标签: java swing


【解决方案1】:

有两种方法可以进行检查:

  1. 定义标志isUser。默认情况下,标志为true。在以编程方式更改之前将其设置为 false 并在设置组合框值后重置。在侦听器中,只需检查标志并在必要时跳过该操作。
  2. 保留对侦听器的引用并在设置值之前将其删除,然后添加。

【讨论】:

【解决方案2】:

据我了解,您可以很容易地使用标志来解决您的问题。 只需制作一个布尔标志,例如isDoneByMethod 将在设置为true 的方法的入口处设置为false 并在这两者之间对组合框进行操作。然后在itemStateChanged() 中检查isDoneByMethodflag 的值并采取相应措施。

【讨论】:

    【解决方案3】:

    我有类似的情况,我需要区分两种情况。这里讨论的两个选项(监听器的标志和删除/添加)并不总是有效,因为项目监听器是在 EDT 线程上异步调用的。但是删除和添加特定的项目侦听器更安全。为了进一步确保在添加项目侦听器之前处理所有先前的操作,我在再次添加侦听器之前使用fireEvents()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      相关资源
      最近更新 更多