爲什麼extends JFrame implements ActionListener
是一個糟糕的設計決策?JFrame子類和ActionListener接口實現
回答
有幾點:
- 擴展一個
JFrame
可能是一個錯誤的做法 - 實現上
JFrame
的ActionListener
可能會導致非面向對象的代碼。
錯誤的方法?
如果這個想法是一個GUI應用程序正在製作,那麼,一個不是JFrame
的擴展,但實際上是編寫一個應用程序。
因此,JFrame
將成爲應用程序的一部分,而不是應用程序本身。因此,JFrame
應該是班級中的一個對象。
實現上JFrame
的ActionListener
可能會導致非面向對象的代碼
考慮以下情況 - 作爲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
語句的部分。
的解釋,我認爲這是一個不好的設計。因爲,你有看法混合控制器代碼..如果你想跟隨MVC模式,你不應該將它們混合..
此外, A JFrame
通常不會收到操作。它的子對象將是ActionEvent
的恩人。
一個更好,更多的面向對象的方法將是有單獨的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:
- 1. 實現與jframe類的接口
- 2. 子類實現Runnable接口
- 3. JFrame和ActionListener
- 4. JFrame - ActionListener
- 5. 在一個類中實現超級子接口都(A類實現了超接口,子接口)
- 6. 實現與子類的接口
- 7. 強制接口的子類實現ToString
- 8. 在子接口或實現類
- 9. 要子類或實現接口
- 10. 類設計:類實現接口實現另一個接口
- 11. 實現通用接口的父類和子類重複
- 12. 實現和接口
- 13. 的JFrame和ActionListener的JPanel的
- 14. ActionListener實現
- 15. 實現接口和自動加載類
- 16. Java:接口和抽象類的實現
- 17. 通用接口方法和實現類
- 18. 嵌套接口和抽象實現類
- 19. 實現接口的類和genric對象
- 20. 實現接口的MySql和SQlite類
- 21. 抽象類實現接口
- 22. 基類實現接口
- 23. 接口類實現Runnable
- 24. 實現接口Singleton類
- 25. 匿名類實現接口
- 26. 接口實現時不透露實現接口的類
- 27. 接口和子類
- 28. 顯式接口實現和多接口
- 29. 將Arrow Keylistener添加到實現ActionListener的Jframe中
- 30. 實現和接口已由超類實現?
這是一個家庭作業? – 2011-01-05 17:00:28
@Dave Jarvis:不,這是針對我不懂的語言的特定語言問題。 – JHarley1 2011-01-05 17:02:51