4

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

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

谢谢!

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

4

3 回答 3

6

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

  1. 定义一个标志isUser。该标志是true默认的。在以编程方式更改之前将其设置为false并在设置组合框值后重置。在侦听器中,只需检查标志并在必要时跳过该操作。
  2. 保留对侦听器的引用并在设置值之前将其删除,然后添加。
于 2012-04-26T08:50:45.287 回答
4

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

于 2012-04-26T08:48:45.723 回答
0

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

于 2022-02-24T14:31:46.873 回答