监听器Listener
一、Listener是什么?
概念: 监听器用于监听web应用中某些对象( request, session, application)状态的变化,然后作出相应的响应处理。实现原理:事件监听机制涉及到三个组件:事件源、事件、事件监听器。
- 事件源:发生事件的组件或对象。
- 事件:每个事件源都对应一组事件。比如按钮被点击, session创建、销毁等等
- 事件监听器:用来监听事件源上ー个或多个事件。
上述三个组件都定义好了,我们要做的就是当事件发生时,完成事件处理。编写监听器的实现类
工作原理:当事件源上发生某一个动作时,它会调用事件监听器的一个方法,并在调用该方法时把事件对象(封装事件源及动作)传递进去,开发人员在监听器中通过事件参数对象,就 可以拿到事件源,从而对事件源进行处理。
二、简单GUI编程理解监听器:
事件源:frame窗口
事件:点击关闭
监听器:匿名内部类(实现监听器),监听窗口关闭
public class Demo01 {
public static void main(String[] args) {
//创建窗口对象
Frame frame = new Frame("我的窗口");
frame.setSize(500,500);
//显示窗口
frame.setVisible(true);
//添加监听器
frame.addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
}
@Override
public void windowClosing(WindowEvent e) {
System.out.println("窗口要关闭了");
//关闭窗口
frame.dispose();
}
@Override
public void windowClosed(WindowEvent e) {
}
@Override
public void windowIconified(WindowEvent e) {
}
@Override
public void windowDeiconified(WindowEvent e) {
}
@Override
public void windowActivated(WindowEvent e) {
}
@Override
public void windowDeactivated(WindowEvent e) {
}
});
}
}
三、监听器原理
监听器是利用观察者设计模式实现的。本质采用了接口回调。原理如下:
//事件源
public class Person {
private String name;
//监听器声明
private PersonListener listener;
public Person() {
}
public Person(String name, PersonListener listener) {
this.name = name;
this.listener = listener;
}
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//事件
public void eat(){
System.out.println(this.name+"\tis eating....");
if (listener!=null){
listener.doEat(new Event(this));
}
}
public void run(){
System.out.println(this.name+"\tis running....");
if (listener!=null){
listener.doRun(new Event(this));
}
}
//注册监听器
public void register(PersonListener listener){
this.listener = listener;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", listener=" + listener +
'}';
}
}
//事件参数(事件源对象或动作)
public class Event {
//事件参数(事件源对象或动作)
private Object source;
public Event() {
}
public Event(Object source) {
this.source = source;
}