2010-01-26 17 views
1

在我的代碼中,兩個組合框被添加到actionListener(this);Java - 爲什麼組件函數調用actionPerformed?

在我的代碼的另一部分,我調用一個組合框函數,它將索引設置爲某個值。這又會調用actionPerfoemed,所以getSource == comboBox是真的。每次我調用set函數時,都會再次調用actionPerformed,創建一堆函數調用,然後解壓縮到第一個函數調用。

有沒有辦法來防止這種情況?

+1

如果我沒有弄錯,對actionPerformed的調用是命令模式的一部分。至於預防它,我不確定。 – 2010-01-26 03:40:09

+0

http://en.wikipedia.org/wiki/Command_pattern#Example – 2010-01-26 04:06:35

+0

你能發佈代碼嗎?這聽起來像你沒有詢問命令模式,但更多的是關於如何停止這一長串動作執行的方法。 – 2010-01-26 05:23:12

回答

1

如果問題只是初始設置,您可以推遲添加偵聽器,直到都被初始化後的。有更多的討論here

+0

是的,這就是發生了什麼事情。感謝您的鏈接。 – ShrimpCrackers 2010-01-26 06:44:59

+0

非常好!請考慮接受和/或投票回答這個問題。 – trashgod 2010-01-26 16:56:37

1

Swing tutorial

組合框也生成項目的事件,這是發射時的任何項目選擇狀態的變化。

當用戶用鼠標點擊項目時,或者當您的軟件調用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線索。

相關問題