2012-07-11 46 views
16

實現java.awt.event.ActionListener接口的最佳方式是什麼?您的類應該實現ActionListener還是使用匿名ActionListener類的對象

讓你的類實現ActionListener並添加爲一個ActionListener:

class Foo implements ActionListener{ 

    public Foo() { 
     JButton button = new JButton(); 
     button.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e) { 

    } 
} 

或添加匿名ActionListener的類的對象:

class Foo{ 

    public Foo() { 
     JButton button = new JButton(); 
     button.addActionListener(new ActionListener() {  
      public void actionPerformed(ActionEvent e) { 

      } 
     }); 
    } 
} 

回答

30

一些(桃皮絨/克列奧帕特拉)說幾乎從來沒有使用ActionListener,而是使用諸如AbstractAction之類的動作。讓你的GUI類實現你的監聽器幾乎總是一個糟糕的理想,因爲這會破壞Single Responsibility Principle,並使你的代碼更難維護和擴展,所以我強烈建議你不要這樣做。

因此,例如,一個內部類此:

import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 

class Foo { 

    public Foo() { 
     JButton button = new JButton(new ButtonAction("Action", KeyEvent.VK_A)); 
    } 

    private class ButtonAction extends AbstractAction { 
     public ButtonAction(String name, Integer mnemonic) { 
     super(name); 
     putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     System.out.println("button pressed"); 
     } 
    } 

} 
+0

+1 - AbstractAction – 2012-07-11 17:30:22

+0

+1對於'AbstractAction'和['Single Responsibility Principle'](http://en.wikipedia.org/wiki/Single_responsibility_principle)。 – 2012-07-11 17:56:04

+1

不錯,但它似乎更復雜(以代碼維護術語),並且更難以閱讀。或者我錯了? – elias 2012-07-11 17:57:15

4

這要看情況。如果您想跨多個組件重複使用ActionListener,則選項1更好。如果ActionListener只會與一個按鈕相關聯,則選項二很好。

一般來說,如果您預計項目會有一些增長,您將創建一個單獨的類(或內部類)。 Foo不需要實現ActionListener

+2

有一個gui類實現ActionListener只用於玩具程序。由於他在詢問「最佳實踐」,因此在任何情況下都沒有這種用法。 – 2012-07-11 19:05:52

8

第二個選項(匿名類)當然更好,另一種選擇是在Foo之內有一個嵌套類。

我不會第一個選項去的原因有兩個:

  • Foo的用戶不應該知道,它實現了ActionListener
  • 您不能在同一個類中實現兩個不同的偵聽器。
+0

我會第一個原因upvote這個答案,但第二個原因是錯誤的恕我直言。你可以檢查ActionEvent的來源並決定你應該採用的代碼路徑。這是否是一個優雅的解決方案是另一個討論,但它肯定是可能的 – Robin 2012-07-11 21:42:00

+4

@Robin:你說的對,但那不是我的觀點。我的意思是一個人不能在同一個類中實現兩次ActionListener。 – casablanca 2012-07-12 04:14:42