2012-09-17 225 views
8


對不起,標題可能太泛泛。ActionListener最佳做法

我已經在Java讀取How to Write an Action Listener教程,我已經讀過this question,但我也有疑問:我想知道哪個解決方案是最好的,當我不得不執行相同的操作多個時間。

我想重複使用相同的ActionListener,但我不確定如何以最佳方式實現此目的(從代碼可讀性,代碼可保留性,性能和代碼樣式來講)。

首先,「標準」代碼(如果我不打算重用的動作監聽器,我會用):

btnMenu.addActionListener(
    new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      Navigator.showMenu(); 
     } 
    } 
); 

這樣我不能重用什麼OBV,因爲它是一個匿名的內部類...

現在,我可以認爲以下解決方案:

  1. 商店匿名內部類的一個字段(即最有可能是static final)的參考;
  2. 編寫一個實現ActionListener接口的新類。

用於解決方案1實施例的代碼:

public static final MENU_ACTION_LISTENER = new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     Navigator.showMenu(); 
    } 
}; 

btnMenu.addActionListener(MENU_ACTION_LISTENER); 

例代碼溶液2:

// package-private, only GUI-package classes should be able to use it. 
// most likely I won't ever need to subclass it, so why not making it final? 
final class MenuActionListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     Navigator.showMenu(); 
    } 
} 

// now, wherever I need to use it: 
btnMenu.addActionListener(new MenuActionListener()); 

我有兩種解決方案有些疑惑:

  1. 在哪裏存儲引用匿名操作監聽器?我可以有一個工具類(例如ActionListenersUtil),其中存儲我想要在static final字段中重用的所有動作偵聽器,但我不喜歡它......在我看來,糟糕的設計。

  2. 它更有意義,可能是最好遵循Command Pattern ......我最初對包的一些疑問......我想有一個單獨的包例如,對於GUI元素com.myapp.guicom.myapp.gui.listeners所有聽衆(聽衆,但是當我寫下這些時,我意識到我沒有選擇:唯一有意義的地方是在同一個包中(因爲他們必須是包私有的),即使爲了我的命令,但我仍然有一些疑問,因爲即使在GUI改變的情況下,大多數動作監聽器也可以重用;將它放在同一個包中仍然是個不錯的主意?

另一個問題:調用btnMenu.addActionListener(MENU_ACTION_LISTENER);btnMenu.addActionListener(new MenuActionListener());(從JVM的角度講,類加載,類編譯,每個類佔用的內存,垃圾回收等等)之間有什麼區別?

請幫忙,我現在很困惑! :(

回答

14

最好的方法是創建Action而不是ActionListener如果您必須將其附加到按鈕,菜單...。一個ActionJButton的模型,該模型是爲了共享

這也爲您提供了更改的文本,圖標的功能,啓用的狀態,並且該Action連接到所有按鈕的其他屬性同時沒有多次通話。另外,它可以附加到菜單項目等。

要創建Action,您不必從頭開始。 AbstractAction是一個很好的起點。 Swing Action tutorial也是一個很好的閱讀。

+3

+1這也使您能夠在沒有多次調用的情況下同時更改「動作」所連接的所有按鈕的文本,圖標,啓用狀態和其他屬性。另外,它可以附加到菜單項目等。 – Brian

+1

+1000如果我可以...... ;-) –

+0

@布萊恩非常好的評論。我複製粘貼它的答案,使其更加完整 – Robin