2

我对编程很陌生,对 Java 也很陌生。在今年秋天开始计算机科学课程之前,我正在自学,我对两位不同作者的语法感到好奇。在一本书中,通常通过将类作为 JFrame 的扩展来建立 JFrame

public class MyClass extends JFrame {

ETC

但是,另一位作者以及该站点上的问题通常会在此类内部建立一个框架,如下所示:

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

首先,一个比另一个有什么优势?在我看来,而且我几乎不是专家,让一个类成为 JFrame 的扩展会更容易设置框架的参数以及向其中添加组件。

扩展格式的IE,你简单说

add(component);

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

frame.getContentPane().add(component);

这似乎更乏味。

有人可以简明扼要地解释这背后的原因,或者这只是一个偏好问题。我对此进行了调查,但无法得到直截了当的答案。

4

2 回答 2

5

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

  • 通常更喜欢组合而不是继承。
  • 仅当您计划更改其固有行为(即,覆盖其一个或多个方法)时才扩展一个类。
  • 通过不扩展 JFrame,可以更轻松地创建最大化内聚和最小化耦合的类,以及编写干净的基于 MVC 的代码。这个概念的一个更重要的例子是避免让您的 GUI 代码(您的视图代码)实现任何侦听器接口(您的控制代码)。对于婴儿程序来说没问题,但对于有可能变得复杂的成人代码来说就不行了。
  • 通过不扩展诸如 JFrame 之类的大型复杂类,您可以降低难以调试隐藏的覆盖不良行为的风险。尝试扩展 JFrame 或 JPanel 并提供类 agetX()getY()方法以了解我的意思!
  • 如果您使用的 IDE 为您的类的对象提供了可用方法的建议,那么如果您不覆盖 JFrame 等巨大的复杂类,您将大大减少可能的建议方法的数量(和复杂性)。
  • 通过调整您的 Swing GUI 以创建 JPanel 而不是覆盖 JFrame,您可以极大地提高 GUI 使用方式的灵活性。现在它可以作为更复杂的 GUI 的一部分或作为 CardLayout 视图交换的一部分放置在另一个 JPanel 中的 JDialog、JOptionPane、JApplet 中......我可以继续下去。
  • 基于与上述相同的原因,我的许多 GUI 都是这样做的,创建 JPanel,我可以通过将它们放在小型测试程序中的 JFrames 中进行隔离测试,然后再将它们添加到更大的整个应用程序中。
于 2013-07-20T18:24:16.980 回答
3

传统上,您不会创建特殊类型的框架,因此您不应该扩展 JFrame。

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

也就是说,从面向对象的角度来看,使用 JFrame 比扩展一个 JFrame 更干净。

于 2013-07-20T18:22:39.823 回答