2012-04-26 84 views
4

在我的swing应用程序中如果用户更改了值(通过itemStateChanged()),我有一个ItemListener的组合框。 但是我也有一个不同的功能来改变组合框的值。在这种情况下,我不希望X完成。仅在用户交互后调用itemStateChanged()

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

谢谢!

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

+0

的[的Java Swing组合框removeAllItems调用ItemStateChanged也?](http://stackoverflow.com/questions/10202718/java-swing-combobox-removeallitems-calling-itemstatechanged-also) – 2012-04-26 09:14:04

回答

6

有2种方法做了检查:

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

+1我忘了可能重复关于第二种方式,很好。 – Boro 2012-04-26 08:52:33

+1

3.rd的方式是使用[从焦点与不安全的KeyListener添加到内部JList](http://stackoverflow.com/a/9991314/714968),对JComboBox没有任何最开心的(我的观点) – mKorbel 2012-04-26 08:55:28

+0

@mKorbel也许现在,该代码将“在阳光下度过一天”。 :) – 2012-04-26 09:18:02

4

从我的理解,你可以很容易地使用标志来解决你的问题。 只需制作一个布尔标志,例如isDoneByMethod这将进入方法设置为true和结束设置为false和这两者之间的组合框操作。然后在itemStateChanged()里面检查isDoneByMethod标志的值并相应地采取行动。