GUI编程笔记(java)05:GUI事件监听机制原理和举例说明

时间:2022-02-21 11:12:16

1.事件监听机制:
       A:事件源          事件发生的地方
       B:事件             就是要发生的事情
       C:事件处理       就是针对发生的事情做出的处理方案
       D:事件监听       就是把事件源和事件关联起来

2.举例:人受伤事件。

事件源:人(具体的对象)
         Person p1 = new Person("张三");
         Person p2 = new Person("李四");

事件:受伤
    interface 受伤接口 {
        一拳();
        一脚();
     一板砖();
}

事件处理:
             受伤处理类 implements 受伤接口 {
             一拳(){ System.out.println("鼻子流血了,送到卫生间洗洗"); }
             一脚(){ System.out.println("晕倒了,送到通风处"); }
          一板砖(){ System.out.println("头破血流,送到太平间"); }
}

事件监听:
     p1.注册监听(受伤接口)

2.窗体关闭案例代码:

这里事件源是:窗体

事件:对窗体的处理

事件处理:关闭窗体System.exit(0);

事件监听:

package cn.itcast_02;

import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener; public class FrameDemo {
public static void main(String[] args) {
// 创建窗体对象
Frame f = new Frame("窗体关闭案例"); // 设置窗体属性
f.setBounds(400, 200, 400, 300); // 让窗体关闭
//事件源
//事件:对窗体的处理
//事件处理:关闭窗口(System.exit(0));
//事件监听
f.addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
} @Override
public void windowIconified(WindowEvent e) {
} @Override
public void windowDeiconified(WindowEvent e) {
} @Override
public void windowDeactivated(WindowEvent e) {
} @Override
public void windowClosing(WindowEvent e) {
System.exit(0);
} @Override
public void windowClosed(WindowEvent e) {
} @Override
public void windowActivated(WindowEvent e) {
}
}); // 设置窗体可见
f.setVisible(true);
}
}

这时候我们点击出现的窗口的关闭按钮就会关闭窗口;但是感觉上还是不够简化,很多行代码是多余的,需要优化一下:

3.使用适配器进行简化上面的代码:

(1)这里我们通过一个案例说明一下:适配器设计模式

首先我们定义一个用户数据操作接口:UseDao

package cn.itcast_03;

/*
* 针对用户操作的四种功能
*/
public interface UserDao {
public abstract void add(); public abstract void delete(); public abstract void update(); public abstract void find();
}

接着我们定义一个适配器抽象类UseAdapter,实际上就是让UseAdapter实现UserDao接口的方法,但是所有的方法体为空,代码如下:

package cn.itcast_03;

public abstract class UserAdapter implements UserDao {

    @Override
public void add() {
} @Override
public void delete() {
} @Override
public void update() {
} @Override
public void find() {
} }

现在我们知道实际上适配器帮我们做了缓冲,他帮忙实现所有的方法,但是方法体全是空,接下来我们在定义一个具体的方法实现类继承自这个抽象适配器类UserAdapter,这里我们定义UserDaoImpl2类,如下:

package cn.itcast_03;

public class UserDaoImpl2 extends UserAdapter {
@Override
public void add() {
System.out.println("添加功能");
}
}

接下来我们编写一个测试类UserDaoDemo类,如下:

package cn.itcast_03;

/*
* 问题:
* 接口(方法比较多) -- 实现类(仅仅使用一个,也得把其他的实现给提供了,哪怕是空实现)
* 太麻烦了。
* 解决方案:
* 接口(方法比较多) -- 适配器类(实现接口,仅仅空实现) -- 实现类(用哪个重写哪个)
*/
public class UserDaoDemo {
public static void main(String[] args) {// 我没有说我们需要四种功能都实现啊。
UserDao ud2 = new UserDaoImpl2();
ud2.add();
}
}

运行结果如下:

GUI编程笔记(java)05:GUI事件监听机制原理和举例说明

(2)接下来使用适配器改进窗体关闭的代码:

package cn.itcast_02;

import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener; public class FrameDemo {
public static void main(String[] args) {
// 创建窗体对象
Frame f = new Frame("窗体关闭案例"); // 设置窗体属性
f.setBounds(400, 200, 400, 300); // 让窗体关闭
//事件源
//事件:对窗体的处理
//事件处理:关闭窗口(System.exit(0));
//事件监听 //用适配器类改进
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}); // 设置窗体可见
f.setVisible(true);
}
}