0

我正在研究 Java Swing 以及如何使用适配器模式来处理事件,而不是覆盖所有处理事件的方法。

我找到了这个简短的例子,我想知道我是否理解它:

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;

public class Sketcher {
    JFrame window = new JFrame("Sketcher");

    public Sketcher() {
        window.setBounds(30, 30, 300, 300);
        window.addWindowListener(new WindowHandler());
        window.setVisible(true);
    }

    class WindowHandler extends WindowAdapter {
        public void windowClosing(WindowEvent e) {
            System.out.println("closing");
            window.dispose(); // Release the window resources
            System.exit(0); // End the application
        }
    }

    public static void main(String[] args) {
        new Sketcher();
    }
}

我的理解是:

Sketcher类包含一个 main 方法,它简单地创建一个新的 Sketcher 实例。

Sketcher实例创建一个新的JFrame对象,该对象只是在监视器上显示一个框架。

因此,当我创建一个新的 Sketcher 对象时,会创建一个新的 JFrame 对象。

在这里,我有我的第一个疑问(这是一般的 Java 疑问):

为什么我不在 Sketcher 类的构造函数中创建 JFrame windows 对象?

不管怎样,在构造函数中,我为 JFrame 对象设置了一些属性,并向这个 JFrame 添加了一个 WindowListener。

现在 addWindowListener 是一个新的WindowHandler对象,它是一个处理 windows 事件的自定义对象。

现在我有两种可能来处理这些事件:

  1. 使用经典的监听器:在这种情况下,我必须为 JFrame 上可能发生的所有可能事件实现一个特定的监听器

  2. 使用适配器(如本例中),因此在本例中,我使用了一个名为WindowHandler的内部类,它扩展了类WindowAdapterWindowAdapter类包含所有可能的 JFrame 事件的 void 方法。因此,在WindowHandler中,我只能定义我想要处理的方法,而不是所有方法。

我的推理对吗?这是一个很好的教程示例还是它提出了一些我现在看不到的问题?

肿瘤坏死因子

安德烈亚

4

1 回答 1

1

你的推理是正确的,但这里有一些注意事项:

  1. 您问了这个问题,为什么我不在 Sketcher 类的构造函数中创建 JFrame windows 对象?

    编译器正在为您做一些工作;它实际上将 JFrame 的初始化放置在您的构造函数中。您还可以在构造函数中显式放置 JFrame 初始化。

  2. 您的WindowHandler课程不必内部课程;它可以是任何实现WindowListener或扩展的类WindowAdapter

  3. AWT 和 Swing 中的XXXAdapter类只是提供相关接口的无操作便利实现的类的命名约定。它们并不是真正的适配器(见下文)。

  4. 您的main实现不必框架的类中;它可以在任何班级。

通常,我们不喜欢在构造函数中创建一堆东西,尤其是在可能有副作用的情况下。最好提供单独的构造和初始化方法。

特别是对于 Swing,通常将组件子类化以提供应用程序所需的 UI 专业化,包括 JFrame。但保持业务逻辑分开。

即使 swing 类被命名为WindowAdapter,它实际上并没有适应适配器模式意义上的任何东西。它提供的是WindowListener接口所有方法的默认无操作实现,它允许开发人员只覆盖他/他感兴趣的方法。

所以我想说这更多的是研究而overriding不是适应;后者通常用于使两个不兼容的 API 一起工作

于 2013-09-24T16:02:27.710 回答