自定义事件监听器示例

监听器是一个实现特定接口的普通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;
	}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值