监听器是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性的改变,当被监听对象发生上述事件后,监听器某个方法将被立即执行。
监听器机制:
1、设计三个要素
事件源:被监听的对象
事件对象:
事件监听器:
2. 对某个源注册一个监听器,此源便成为一个事件源,当事件源上发生某一个动作时,监听器的某个方法将会被调用执行,在执行事件监听器的这个方法时,同时会把事件监听对象传递给此方法,开发人员在监听器中可以拿到事件源,从而对事件源进行操作。如下图所示:
//下面是一个示例代码;
Person是一个事件源,它提供了一个监听器,可供外面对象向其注册一个监听器。此监听器将会监听person对象的eat和run两个方法,当有监听器注册时,它将执行监听器的dorun和doeat方法。同时将事件对象传递进去
listen.dorun(new Event(this));
this代表当前事件源的一个对象,此对象正发生run方法。在监听器中,执行dorun方法时,其将可以通过getSource得到事件源,通过此事件源可以执行事件源的相关操作。监听器的实现使用的是一种观察者设计模式。此设计模式将单独进行编写一个博客。
public class MyListener {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p1 = new Person("张三");
//向p1注册一个监听器
p1.register(new PersonListener() {
@Override
public void dorun(Event e) {
// TODO Auto-generated method stub
Person p = (Person)e.getSource();
System.out.println(p.getName()+"在跑步");
}
@Override
public void doeat(Event e) {
// TODO Auto-generated method stub
Person p = (Person)e.getSource();
System.out.println(p.getName()+"在吃饭");
}
});
p1.eat();
p1.run();
}
}
//设计一个事件源
class Person{
private String name;
PersonListener listen; //提供一个监听器,用于监听person的eat和run方法
Person(String name){
super();
this.name = name;
}
public void run(){
//有监听器注册,则调用监听器的dorun方法
if(listen!=null){
listen.dorun(new Event(this));
}
}
public void eat(){
//有监听器注册,则调用监听器的doeat方法
if(listen!=null){
listen.doeat(new Event(this));
}
}
//注册一个监听器
public void register(PersonListener listen){
this.listen = listen;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
}
//事件监听器
interface PersonListener{
public void dorun(Event e); //事件方法
public void doeat(Event e); //事件方法
}
//事件对象
class Event {
Person source;
/**
* @return the source
*/
public Person getSource() {
return source;
}
/**
* @param source the source to set
*/
public void setSource(Person source) {
this.source = source;
}
public Event() {
super();
// TODO Auto-generated constructor stub
}
public Event(Person source) {
super();
this.source = source;
}
}