2012-04-26 83 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標誌的值並相應地採取行動。