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

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();
    }
}

运行结果如下:

 

(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);
    }
}

 

posted on 2015-08-25 21:23  鸿钧老祖  阅读(808)  评论(0编辑  收藏  举报

导航