javaweb学习总结(四十四)——监听器(Listener)学习(转)
一、监听器介绍
1.1、监听器的概念
监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。
1.2、监听器案例——监听window窗口的事件监听器
1 package me.gacl.listener.demo;
2
3 import java.awt.Frame;
4 import java.awt.event.WindowEvent;
5 import java.awt.event.WindowListener;
6
7 public class Demo1 {
8
9 /**
10 *java的事件监听机制
11 *1、事件监听涉及到三个组件:事件源、事件对象、事件监听器
12 *2、当事件源上发生某一个动作时,它会调用事件监听器的一个方法,并在调用该方法时把事件对象传递进去,
13 * 开发人员在监听器中通过事件对象,就可以拿到事件源,从而对事件源进行操作。
14 */
15 public static void main(String[] args) {
16
17 Frame f = new Frame();
18 f.setSize(400, 400);
19 f.setVisible(true);
20
21 //注册事件监听器
22 f.addWindowListener(new WindowListener(){
23
24 public void windowActivated(WindowEvent e) {
25
26 }
27
28 public void windowClosed(WindowEvent e) {
29
30 }
31
32 /**
33 * 当window窗体关闭时就会WindowListener这个监听器监听到,
34 * 监听器就会调用windowClosing方法处理window窗体关闭时的动作
35 */
36 public void windowClosing(WindowEvent e) {
37 //通过事件对象e来获取事件源对象
38 Frame f = (Frame) e.getSource();
39 System.out.println(f+"窗体正在关闭");
40 f.dispose();
41 }
42
43 public void windowDeactivated(WindowEvent e) {
44
45 }
46
47 public void windowDeiconified(WindowEvent e) {
48
49 }
50
51 public void windowIconified(WindowEvent e) {
52
53 }
54
55 public void windowOpened(WindowEvent e) {
56
57 }
58 });
59 }
60 }
1.3、设计一个可以被别的对象监听的对象
我们平时做开发的时候,我们是写监听器去监听其他对象,那么我们如果想设计一个对象,让这个对象可以被别的对象监听又该怎么做呢,可以按照严格的事件处理模型来设计一个对象,这个对象就可以被别的对象监听,事件处理模型涉及到三个组件:事件源、事件对象、事件监听器。
下面我们来按照事件处理模型来设计一个Person对象,具体代码如下:
1 package me.gacl.observer;
2
3 /**
4 * @ClassName: Person(事件源)
5 * @Description: 设计一个Person类作为事件源,这个类的对象的行为(比如吃饭、跑步)可以被其他的对象监听
6 * @author: 孤傲苍狼
7 * @date: 2014-9-9 下午9:26:06
8 *
9 */
10 public class Person {
11 /**
12 * @Field: listener
13 * 在Person类中定义一个PersonListener变量来记住传递进来的监听器
14 */
15 private PersonListener listener;
16
17 /**
18 * @Method: eat
19 * @Description: 设计Person的行为:吃
20 * @Anthor:孤傲苍狼
21 *
22 */
23 public void eat() {
24 if (listener != null) {
25 /**
26 * 调用监听器的doeat方法监听Person类对象eat(吃)这个动作,将事件对象Event传递给doeat方法,
27 * 事件对象封装了事件源,new Event(this)中的this代表的就是事件源
28 */
29 listener.doeat(new Event(this));
30 }
31 }
32
33 /**
34 * @Method: run
35 * @Description: 设计Person的行为:跑
36 * @Anthor:孤傲苍狼
37 *
38 */
39 public void run() {
40 if (listener != null) {
41 /**
42 * 调用监听器的dorun方法监听Person类对象run(跑)这个动作,将事件对象Event传递给doeat方法,
43 * 事件对象封装了事件源,new Event(this)中的this代表的就是事件源
44 */
45 listener.dorun(new Event(this));
46 }
47 }
48
49 /**
50 * @Method: registerListener
51 * @Description: 这个方法是用来注册对Person类对象的行为进行监听的监听器
52 * @Anthor:孤傲苍狼
53 *
54 * @param listener
55 */
56 public void registerListener(PersonListener listener) {
57 this.listener = listener;
58 }
59 }
60
61 /**
62 * @ClassName: PersonListener(事件监听器)
63 * @Description: 设计Person类(事件源)的监听器接口
64 * @author: 孤傲苍狼
65 * @date: 2014-9-9 下午9:28:06
66 *
67 */
68 interface PersonListener {
69
70 /**
71 * @Method: doeat
72 * @Description: 这个方法是用来监听Person对象eat(吃)这个行为动作,
73 * 当实现类实现doeat方法时就可以监听到Person类对象eat(吃)这个动作
74 * @Anthor:孤傲苍狼
75 *
76 * @param e
77 */
78 void doeat(Event e);
79
80 /**
81 * @Method: dorun
82 * @Description: 这个方法是用来监听Person对象run(跑)这个行为动作,
83 * 当实现类实现dorun方法时就可以监听到Person类对象run(跑)这个动作
84 * @Anthor:孤傲苍狼
85 *
86 * @param e
87 */
88 void dorun(Event e);
89
90 }
91
92 /**
93 * @ClassName: Event(事件对象)
94 * @Description:设计事件类,用来封装事件源
95 * @author: 孤傲苍狼
96 * @date: 2014-9-9 下午9:37:56
97 *
98 */
99 class Event {
100
101 /**
102 * @Field: source
103 * 事件源(Person就是事件源)
104 */
105 private Person source;
106
107 public Event() {
