2011-01-05 95 views
1

爲什麼extends JFrame implements ActionListener是一個糟糕的設計決策?JFrame子類和ActionListener接口實現

+0

這是一個家庭作業? – 2011-01-05 17:00:28

+0

@Dave Jarvis:不,這是針對我不懂的語言的特定語言問題。 – JHarley1 2011-01-05 17:02:51

回答

3

有幾點:

  • 擴展一個JFrame可能是一個錯誤的做法
  • 實現上JFrameActionListener可能會導致非面向對象的代碼。

錯誤的方法?

如果這個想法是一個GUI應用程序正在製作,那麼,一個不是JFrame的擴展,但實際上是編寫一個應用程序。

因此,JFrame將成爲應用程序的一部分,而不是應用程序本身。因此,JFrame應該是班級中的一個對象。

實現上JFrameActionListener可能會導致非面向對象的代碼

考慮以下情況 - 作爲GUI應用程序開始變得很大,而且我們已經開始添加大量的按鈕和導致ActionEvent s的菜單。

如果JFrame本身要獲取事件,那麼actionPerformed方法是什麼樣子?

大概是這樣的:

public void actionPerformed(ActionEvent e) { 
    Object source = e.getSource(); 

    // Find out which component fired the event 
    if (source == masterButton) { 
    // ... do something 
    } else if (source == anotherButton) { 
    // ... do something else 
    } else if (...) 
    // ... and so on ... 
    } else if (...) 
    // ... and so on ... 
    } 
} 

讓人驚訝。

我們將開始獲取與應用程序中所有組件緊密耦合的代碼,並且可維護性將很快出現在窗口之外。


如果,例如,GUI應用程序具有ActionLister S的迴應每一個組件實例,那麼我們就能夠向上突破actionPerformed方法的動作和連接用的所有組件GUI。

例如:

JButton masterButton = new JButton(); 
masterButton.addActionListener(new MasterButtonActionListener()); 

JButton anotherButton = new JButton(); 
anotherButton.addActionListener(new AnotherButtonActionListener()); 

這種方式,將有ActionListeners爲每個按鈕這大概具有不同的功能。 MasterButtonActionListener的責任是處理來自masterButton的事件 - 它不必知道應用程序中的其他按鈕。此外,這將促進組件在其他應用程序或應用程序的其他部分的可重用性,而不必複製並粘貼actionPerformed方法中的單片if-else語句的部分。

+0

如果只有我可以對此進行百萬次提升。 – Tansir1 2011-01-05 17:20:06

+0

Coolbird感謝您花時間發佈這樣的詳細解釋。 – JHarley1 2011-01-05 17:20:14

+0

@ Tansir1:謝謝:) – coobird 2011-01-05 17:21:34

1

如果你讀了有效的Java,項目16個州:

「過的傳承青睞組成」。閱讀給定here

+0

你好阿米爾,你可能會說這是一個更簡單的方法嗎?我用我的JAVA語法非常生疏 - 所以我從另一個繼承 - 但這是一個壞主意,因爲它是一個'普通具體類'。 – JHarley1 2011-01-05 17:14:05

+0

嗨JHarley--他在那裏談論的不是從一個普通的具體課程繼承另一個課程,只是這個課程的變化會直接影響到你的。如果你保留了一個JFrame的引用,你可以封裝它的行爲 - 用sublcassing,你不能。 – 2011-01-05 17:19:22

0

的解釋,我認爲這是一個不好的設計。因爲,你有看法混合控制器代碼..如果你想跟隨MVC模式,你不應該將它們混合..

0

此外, A JFrame通常不會收到操作。它的子對象將是ActionEvent的恩人。

0

一個更好,更多的面向對象的方法將是有單獨的Action對象。這使您可以將組件的功能和狀態分開。它使您的代碼可重用,因爲您可以對按鈕和菜單項使用相同的操作。

例子:

class ExitAction extends AbstractAction{  
    public ExitAction(){ 
     super("Exit"); 
    } 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("Exiting"); 
    } 
} 

JButton exitButton = new JButton(new ExitAction()); 

您可以在Java教程一看How to Use Actions