8.1 小节中的实现了一个图形化窗口,单击窗口右上角的关闭按钮会发现窗口无法关闭,这说明该按钮的单击功能没有实现。按理说 Frame 对象应该实现这个按钮的功能,之所以没有实现,是因为 Frame 的设计者无法确定用户关闭 Frame 窗口的方式,例如是直接关闭窗口还是需要弹出对话框询问用户是否关闭。如果想要关闭窗口,就需要通过事件处理机制对窗口继续监听。

    事件处理机制专门用于响应用户的操作,例如,想要响应用户的单击鼠标、按下键盘等操作,就需要使用 AWT 的事件处理机制。在学习如何使用 AWT 事件处理机制之前,首先介绍几个比较重要的概念,具体如下所示。

    • 事件对象(Event):封装了 GUI 组件上发生的特定事件(通常就是用户的一次操作)
    • 事件源(组件):事件发生的场所,通常就是产生事件的组件
    • 监听器(Listener):负责监听事件源上发生的事件,并对各种事件做出相应处理的对象(对象中包含事件处理器)
    • 事件处理器:监听器对象对接受的事件对象进行相应处理的方法

    上面提到的事件对象、事件源、监听器、事件处理器在整个事件处理机制中都起着非常重要的作用,它们彼此之间有着非常紧密的联系。接下来用一张图来描述事件处理的工作原理,如下所示。
    上图中,事件源是一个组件,当用户进行一些操作时,如果按下鼠标或者释放键盘等,这些动作会触发相应的事件。如果事件源注册事件监听器,则触发的相应事件将会被处理。

    在程序中,如果想实现实现事件的监听机制,首先需要定义一个实现了事件监听器接口的类,例如 Window 类型的窗口需要实现 WindowListener。接着通过 addWindowLinstener()方法为事件源注册事件监听器对象,当事件源上发生事件时,便会触发事件监听器对象,由事件监听器调用相应的方法来处理相应的事件

    接下来,通过一个案例来实现窗口关闭的功能,如下所示。

    1. import java.awt.Frame;
    2. import java.awt.Window;
    3. import java.awt.event.WindowEvent;
    4. import java.awt.event.WindowListener;
    5. public class example08 {
    6. public static void main(String[] args) {
    7. //建立新窗体
    8. Frame frame = new Frame("我的窗体!");
    9. //设置窗体的宽和高
    10. frame.setSize(400, 300);
    11. //设置窗体出现的位置
    12. frame.setLocation(300, 200);
    13. //设置窗体可见
    14. frame.setVisible(true);
    15. //为窗体组件注册监听器
    16. MyWindowListener mw = new MyWindowListener();
    17. frame.addWindowListener(mw);
    18. }
    19. }
    20. //创建 MyWindowListener 类实现 WindowListener 接口
    21. class MyWindowListener implements WindowListener{
    22. //监听器监听事件对象做出处理
    23. public void windowClosing(WindowEvent e) {
    24. Window window = e.getWindow();
    25. //隐藏窗口(此时进程没有结束)
    26. window.setVisible(false);
    27. //释放窗口
    28. window.dispose();
    29. }
    30. public void windowActivated(WindowEvent e) {
    31. }
    32. public void windowClosed(WindowEvent e) {
    33. }
    34. public void windowDeactivated(WindowEvent e) {
    35. }
    36. public void windowDeiconified(WindowEvent e) {
    37. }
    38. public void windowIconified(WindowEvent e) {
    39. }
    40. public void windowOpened(WindowEvent e) {
    41. }
    42. }

    运行程序,生成的窗口,如下图所示。
    QQ截图20200619151915.png

    上述代码块中为窗口添加了关闭功能。为实现此功能,创建了一个实现 WindowListener 接口的事件监听器类 MyWindowListener,当通过 main 方法中 addWindowListener()方法将窗口与监听器对象绑定后,如果单击窗口右上角的关闭按钮,便会触发监听器的 windowClosing()方法,将当前窗口隐藏并且释放,从而关闭了窗口。