2010-10-28 80 views
11

刪除一個匿名的ActionListener我創建的JButtons陣列匿名ActionListeners並在一定條件下我想刪除所有的ActionListeners,但.removeActionListeners方法需要ActionListener作爲參數。我將如何去除動作偵聽器?的Java Swing:如何從一個組件

for (int i=0; i < button.length; i++){ 
    button[i] = new JButton(); 
    button[i].addActionListener(listener.new ButtonListener()); 
} 
+0

(只是注意,這可能不是設計無論你正在嘗試做的有效途徑,更好的讓聽衆有射擊,並有經過一些檢查/多態性禁用動作(可能開關狀態,而不是禁用)。) – 2010-10-28 23:55:52

回答

2

你不能。沒有人提到這些對象。爲了能夠刪除它們,您需要將它作爲數據成員/變量存儲在您的代碼中,然後將該變量傳遞給removeActionListener()方法。但是,您可以使用getActionListeners()方法獲取與Button關聯的所有ActionListener對象的數組。然後,您需要弄清楚刪除哪一個,但如果只有一個,那應該很容易;-)

17

你可以讓他們:getActionListeners方法:

for(JButton currentButton: button) { 
    for(ActionListener al : currentButton.getActionListeners()) { 
     currentButton.removeActionListener(al); 
    } 
} 

我不是當然,如果它會拋出ConcurrentModificationException

+0

也許不是......我敢打賭,它內部存儲的聽衆作爲一個ArrayList,然後把它們拷貝到的ActionListeners數組來回報他們。好奇,想看看它是否會盡管... – 2010-10-28 23:52:09

+0

沒有人會返回一個內部數組,他們會嗎? (它不會調整大小。) – 2010-10-28 23:53:19

+0

for(ActionListener al:button.getActionListeners())這將不會編譯,但它是一個不錯的主意 – 2010-10-28 23:56:40

3

我理解你的問題,正如其他人所建議的,遍歷客戶端類中的所有操作偵聽器可能會解決你的直接問題。

  1. H/W在這種情況下,你真正要做的是延長一個JButton的功能,那就是解決這個問題的一種方法 - 延長JButton,並添加一個名爲removeAllActionListeners()方法(不不帶任何參數)。

    • 在此方法中,你可以通過所有動作偵聽迭代 和 刪除它們。我認爲這是更好的 設計,如果你這樣做,而不是 客戶端類。
  2. 如果你不想這樣做,那麼我認爲湯姆霍金建議在你的ButtonListener中使用狀態是一個好主意。

  3. 如果失敗了,那麼您總是可以選擇以非常「黑客」的方式回退,即在客戶端類中存儲一組動作偵聽器。

    • Map<JButton, ButtonListener>(如果總是隻打算爲每一個按鈕收聽),或
    • Map<JButton, List<ButtonListener>>(如果有可能,每個按鈕多個監聽器)是我可能會使用的東西。

我想方法和是優選的,方法表示設計不良(但更容易一起劈)。

需要注意的是,如果你確實使用方法,或類似的東西,請檢查您正在訪問的方法或屬性是線程安全的(如OscarRyz提到的),如果沒有,用​​保證線程安全。