在我的代碼中,兩個組合框被添加到actionListener(this);Java - 爲什麼組件函數調用actionPerformed?
在我的代碼的另一部分,我調用一個組合框函數,它將索引設置爲某個值。這又會調用actionPerfoemed,所以getSource == comboBox是真的。每次我調用set函數時,都會再次調用actionPerformed,創建一堆函數調用,然後解壓縮到第一個函數調用。
有沒有辦法來防止這種情況?
在我的代碼中,兩個組合框被添加到actionListener(this);Java - 爲什麼組件函數調用actionPerformed?
在我的代碼的另一部分,我調用一個組合框函數,它將索引設置爲某個值。這又會調用actionPerfoemed,所以getSource == comboBox是真的。每次我調用set函數時,都會再次調用actionPerformed,創建一堆函數調用,然後解壓縮到第一個函數調用。
有沒有辦法來防止這種情況?
如果問題只是初始設置,您可以推遲添加偵聽器,直到都被初始化後的。有更多的討論here。
是的,這就是發生了什麼事情。感謝您的鏈接。 – ShrimpCrackers 2010-01-26 06:44:59
非常好!請考慮接受和/或投票回答這個問題。 – trashgod 2010-01-26 16:56:37
組合框也生成項目的事件,這是發射時的任何項目選擇狀態的變化。
當用戶用鼠標點擊項目時,或者當您的軟件調用setSelectedIndex()時,將生成這些事件。
也許你不希望你的actionPerformed()方法在你的軟件調用setSelectedIndex()時被調用。您可能需要一個布爾eventInitiatedBySoftware。在你的主(這)類,你可以說
synchronized(eventInitiatedBySoftware) {
eventInitiatedBySoftware=true;
comboboxeditor.setSelectedIndex(n);
}
,然後在你的聽衆:
public void actionPerformed(ActionEvent ae) {
synchronized(eventInitiatedBySoftware) {
if (eventInitiatedBySoftware) {
eventInitiatedBySoftware=false; // clear your flag.
return; // don't want to process this event.
}
// the rest of your method goes here
}
當你的軟件要調整值,它將布爾設置爲true。 actionPerformed方法將被調用,但是你的測試會意識到這個事件是由軟件啓動的,並且在做任何你現有的代碼之前返回。它將清除布爾值,以便如果用戶現在使用鼠標執行選擇操作,則代碼將會意識到它不是softwareInitiated。
順便說一句,你可能誤解了事件概念。例如,我懷疑你實際上是將「this」添加爲每個組合框的事件監聽器,而不是將組合框添加爲「this」的監聽器。您可能會喜歡看Writing Event Listeners線索。
如果我沒有弄錯,對actionPerformed的調用是命令模式的一部分。至於預防它,我不確定。 – 2010-01-26 03:40:09
http://en.wikipedia.org/wiki/Command_pattern#Example – 2010-01-26 04:06:35
你能發佈代碼嗎?這聽起來像你沒有詢問命令模式,但更多的是關於如何停止這一長串動作執行的方法。 – 2010-01-26 05:23:12