窗口监听事件

Frame类中并没有提供一个关闭窗口的方法,这个时候我们要关闭这个窗口就要使用窗口监听

如何添加窗口监听?

addWindowListener();

  • 我们添加了窗口监听之后就可以通过窗口监听器器捕捉到窗口事件,就可重写不同窗口状态下的方法,这个时候不同情况下我们就会执行不同的功能

我们的窗口事件的触发有很多种状态,我们的窗口监听器中提供了对应这些状态触发的方法

  • 这里我们举几种常用的方法来讲解:
  • 因为我们的窗口监听事件使用的情况并不是很多,尤其是很多例如关闭窗口的操作我们的JFrame类中更是提供了现有的方法直接就可以关闭窗口
public void windowOpened(WindowEvent e);
  1. 窗口关闭中状态(也就是正在关闭但是还没有关闭,当我们点击关闭窗口按钮的时候窗口就会处于关闭中状态,这个时候就会运行这个方法)
public void windowClosing(WindowEvent e);
  1. 窗口已经关闭状态(当我们每次点击关闭按钮的时候,当我们的这个窗口关闭的时候我们的这个方法就会执行一次)
public void windowClosed(WindowEvent e);
  1. 窗口激活状态(每当我们在其他窗口中点击我们的这个窗口我们的这个窗口就会从未激活状态装换到激活状态,我们其实在现实生活中很多时候都是这样,当我们的一个窗口边框为暗色时这个窗口就是未激活状态,如果一个窗口时亮色,这个窗口就是激活状态)
  • 当我们将这个窗口从未激活状态转换到激活状态的时候这个时候就会启动这个方法
public void windowActivated(WindowEvent e);

以上三种就是我们常用的三种窗口事件的触发状态

这里我们举一个例子: ----> 这个例子中我们调用窗口监视器的windowClosing()方法来隐藏或者关闭窗口

  • 也就是要让我们一旦点击这个关闭窗口的按钮之后我们就隐藏或者关闭窗口
package com.ffyc.javaoop.图形界面练习;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

public class WindowFrame extends Frame {
    public WindowFrame(){
        this.setBounds(100,100,400,400);
        this.setBackground(Color.blue);
        this.setVisible(true);
        this.addWindowListener(new MyWindowListener());
    }
    class MyWindowListener extends WindowAdapter {
        @Override
        public void windowClosing(WindowEvent e){

            /*
            在我们的内部类中我们如果内部类中找不到就会到外部内中去找,这个时候我们的setVisible()方法是我们的
            窗口调用的,这个时候我们的这个内部类中就会默认去外部类中去找,就和继承一样,如果内部类没有,这个时候
            我们就回到外部类中去找,如果可以找到这个时候我们就会使用外部类中的

            这个时候我们这个方法的默认调用者是MyWindowListener类的对象,也就是内部类中的this.但是这个时候this
            调用不到这个方法,这个时候我们就会默认使用外部类中去寻找
            这个时候就是使用的外部类的对象进行的调用
             */

            //这个时候我们是使用的是将这个窗口隐藏
            setVisible(false);
            
            
            //这个方法会将我们的这个窗口正常关闭
//            System.exit(0);
            
            //这个方法会将我们的这个窗口非正常关闭(也就是异常关闭)
//            System.exit(1);

        }
        public void windowActivated(WindowEvent e){
            System.out.println("555");
        }
    }
    public static void main(String [] args){
        new WindowFrame();
    }
}
  • 上面我们使用了窗口监听适配器,也就是适配器模式,就是可以减少代码量,因为我们的窗口监听器中的方法有很多我们监听的触发窗口事件的状态有很多,我们不是每次又要全部使用,但是如果我们实现这个窗口监视器接口,这个时候我们就要实现这接口中的全部的抽象方法,但是如果我们继承窗口适配器抽象类,这个时候我们就是需要哪个状态下的方法就重写哪个方法,这个时候就很方便
  • 窗口适配器类 — > WindowAdapter
  • 窗口监视器接口 ---- > WindowListener

如何通过一个按钮去隐藏窗口?

  1. 我们首先创建一个按钮
  2. 然后给这个按钮加上事件监听(addActionListener()😉
  3. 然后我们创建一个时间监听器对象,并且在这个时间监听器中重写actionPerformed()方法
  4. 在actionPerformed()方法中使用getSource()方法然后对其返回值向下转型,这个时候我们就得到了MyFrame对象(也就是我们创建的窗口对象),这个时候我们对我们的MyFrame对象调用setVisible()方法,在其中传入参数false,这个时候就可以将我们的窗口顺利隐藏掉
package com.ffyc.javaoop.图形界面练习;

import java.awt.*;

public class MyFrame2 extends Frame {
    public MyFrame2(){
        this.setLayout(new FlowLayout());
        this.setBounds(100,100,400,400);
        this.setBackground(Color.blue);
        this.setVisible(true);
        Button button = new Button();
        this.add(button);

        //这个时候我们就是异常了这个窗口,这里我们使用了lambda表达式的方式创建了这个函数式接口的实现类的对象
        button.addActionListener(e -> {
            setVisible(false);
        });
    }

    public static void main(String[] args) {
        new MyFrame2();
    }
}
  • 这时候我们可以不使用getSource()方法然后向下转型,因为我们的内部类如果找不到调用对象会自动在外部类中寻找,我们的内部类无条件可以使用外部类中的所有成员,包括私有成员