2011-05-02 137 views
1

我剛剛對uni項目得到了一些不好的反饋,需要一些公正的澄清;Swing組件聽自己vs內部類

任何人都可以解釋什麼時候應該使用(匿名)內部監聽器類與聽自己的組件? (A對B)

一)

public class myButton extends JButton { 

    public myButton() { 

     addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       // handling code... 

      } 
     }); 
    } 
} 

B)

public class myButton extends JButton implements ActionListener { 

    public myButton() { 

     addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e) { 

     // handle the event 
    } 
} 

謝謝你們, 米奇

+3

爲什麼擴展'JButton'? – 2011-05-02 10:36:07

+2

請學習Java命名約定,並堅持他們 – kleopatra 2011-05-02 10:42:33

+1

好老師,假設他/她拒絕了這兩項:-) – kleopatra 2011-05-02 10:47:42

回答

3

對於您有不同的行爲多個按鈕的情況下,更方便爲每個按鈕分配一個單獨的匿名類,您仍然可以在您的類中實現ActionListener並根據源處理事件:

void actionPerformed(ActionEvent e) { 
    if (e.getSrouce() == button1) 
    { ... } 
    else if (e.getSource() == button2) 
    { ... } 
    // ... 
} 
+0

與問題無關,但我似乎在追求:-)這是程序風格,所以不要。 – kleopatra 2011-05-02 10:46:21

+0

我同意。正如我寫的,它是更方便地使用匿名/分班授課,這種情況下,我只是指出了一個類實現ActionListener的所有按鈕的含義。並感謝您的評論。 – MByD 2011-05-02 12:38:03

+0

我覺得OP試圖問一個問題到這就是答案,但我強烈同意[@ AndrewThompson的答案](http://stackoverflow.com/a/5856145/253468)。 – TWiStErRob 2014-10-16 20:12:40

1

我認爲這可能是個人偏好。無論如何,我總是會選擇內部課程作爲區分責任和組織代碼的一種方式。

特別是,它們是使用Adapter類的唯一方法(空類已經實現了一些特定的Listener接口,因此您只需要覆蓋所需的方法,而不需要提供這些方法的空實現你不需要)。

4

C)

JButton myButton = new JButton(); 
myButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     // handling code... 
    } 
}); 
1

的一點是,當你宣佈你myButton類來實現ActionListener,可以增加其可見的API(即增加一個新的公共actionPerformed()方法,通過持有一個參考的任何代碼可自由贖回到myButton)。

既然你可能不希望「actionPerformed」是myButton API的一部分,你應該使用一個內部類,將保留的myButton公共API。

請注意,Swing類充滿了類似於公共方法明確註釋爲「實現細節,不直接調用」的糟糕示例,實際上這是非常糟糕的設計決策。