建立JFrame的语法。哪个是对的?

时间:2013-07-20 18:19:03

标签: java swing inheritance jframe composition

我对编程很新,对Java来说也是新手。我在今年秋天开始开设计算机科学课程之前就开始自学,我对两种不同作者的语法有好奇心。 在一本书中,通常通过使类成为JFrame

的扩展来建立JFrame
public class MyClass extends JFrame {

然而,另一位作者以及该网站上的问题通常会在课程内部建立一个框架:

public class MyClass {
JFrame frame = new JFrame();

首先,一个优于另一个的优点是什么? 在我看来,我几乎不是专家,将类作为JFrame的扩展可以更容易地设置框架的参数,也可以向其添加组件。

IE的扩展格式,你只需说

add(component);

但是,在其他格式中,必须键入:

frame.getContentPane().add(component);

这似乎更乏味。

有人可以简洁地解释这背后的原因,或者只是一个偏好问题。我已经调查了这个并且无法得到直接的答案。

2 个答案:

答案 0 :(得分:5)

有许多(包括我)更喜欢后者的哲学和实践原因:

  • 一般情况下,首选组合而不是继承。
  • 如果您计划更改其固有行为(例如,覆盖其中一个或多个方法),则仅扩展一个类。
  • 通过不扩展JFrame,可以更容易地创建最大化内聚和最小化耦合的类,并编写基于MVC的干净代码。此概念的一个更重要的示例是避免让您的GUI代码(您的 view 代码)实现任何侦听器接口(您的控件代码)。这对于宝宝程序来说是可以的,但对于那些有可能变得复杂的成熟代码却没有。
  • 通过不扩展大型复杂的类(如JFrame),可以降低难以调试隐藏的覆盖错误行为的风险。尝试扩展JFrame或JPanel并为该类提供getX()getY()方法,以了解我的意思!
  • 如果您使用的IDE提供了类对象可用方法的建议,那么如果不覆盖巨大的复杂类(如JFrame),则可以大大减少可能的建议方法的数量(和复杂性)。 / LI>
  • 通过使用Swing GUI来创建JPanel而不是覆盖JFrame,可以大大提高GUI的使用灵活性。现在它可以放在JDialog,JOptionPane,JApplet中,作为更复杂的GUI的一部分放在另一个JPanel中,或者作为CardLayout视图交换的一部分....我可以继续。
  • 与上面相同,我的许多GUI都是这样做的,创建JPanels,我可以通过将它们放在JFrame中的小型测试程序中进行单独测试,然后再将它们添加到更大的整个应用程序中。

答案 1 :(得分:3)

传统上你不是在创建一种特殊类型的框架,所以你不应该扩展JFrame。

您正在创建一个JFrame并将内容放入其中,因此后一种方法更受欢迎。

即。从面向对象的角度来看,使用JFrame更清晰,而不是扩展JFrame。