JAVA的事件处理机制

本文引用了网上的一些案例并加以修改,只是个人做记录用。


java中的事件机制的参与者有3种角色:


1.event object(事件对象):

JAVA中的事件状态对象都必须继承java.util.EventObject(如果不考虑通用性问题也可以不继承),事件对象是在触发事件的时候创建的,JAVA中的Swing编程中的事件对像都是JDK创建的,只有底层才能捕捉到诸如鼠标点击,键盘输入的事件。

创建的事件对象需要作为参数转入listener监听类的相应方法之中,你可以在方法中通过这个事件对象来获取事件的具体信息(如鼠标坐标等....),如果是自定义事件对象则可以放入任何你想要传递的信息,事件对象就想当于一个信息载体。


2.event source(事件源):

事件源可以是任何JAVA对象,包括自己定义的类对象。比如Swing编程中的button就是event source,要想使button对某些事件进行响应,你就需要注册特定的listener,一般是通过addXXXListener(event listener)方法来实现。


3.event listener(事件监听类):

JAVA中的事件监听类都必须继承java.util.EventListener类型的接口(如果不考虑通用性问题也可以不继承),一般我们定义一个接口要继承 java.util.EventListener,并在这个接口中对事件源发生的每个事件都相应地定义一个明确的Java方法。 实现了事件监听者接口中一些或全部方法的类就是事件监听者。


例:

一:定义事件对象,必须继承EventObject

package com.yzl.event;

import java.util.EventObject;

/**
 * @author gfdonx
 * 自定义门的事件类
 * 事件传递的信息只有一个,那就是开门或关门的人是谁
 */
public class DoorEvent extends EventObject{
	
	private static final long serialVersionUID = 1L;
	
	private String name;
	
	public DoorEvent(Object source, String name) {
		super(source);
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}

二、自定义一个事件监听接口,该接口继承自EventListener; 该接口包含对DoorEvent事件的处理程序:在这里是开门和关门的方法。

package com.yzl.listener;

import java.util.EventListener;

import com.yzl.event.DoorEvent;

/**
 * @author gfdonx
 * 自定义监听接口
 * 在接口中只定义了开门和关门的方法。
 */
public interface DoorListener extends EventListener {
	
	/**
	 * 开门方法
	 * @param doorEvent 传入监听类的事件对象
	 */
	public void operDoor(DoorEvent doorEvent);
	
	
	/**
	 * 关门方法
	 * @param doorEvent 传入监听类的事件对象
	 */
	public void closeDoor(DoorEvent doorEvent);
	
}

三、定义一个事件源对象Door,它用一个Collection对象来存储所有的事件监听器对象。事件源对象通过addDoorListener(..)这样的方法来增加监听对象。在相应事件发生的时候 并通过 notifyListeners(..)方法触发事件,在 notifyListeners方法中遍历Collection集全, 通知监听对象:事件发生了,你调用相应的处理函数吧。

package com.yzl.eventsource;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;

import com.yzl.event.SwitchEvent;
import com.yzl.listener.SwitchListener;

/**
 * 
 * @author gfdonx
 * 定义一个门,这个类对象相当于是一个事件源,相当于Swing中的Button
 */
public class Door {
	
	//定义一个Collection用于存储监听对象
	private Collection listeners;
	
	//添加事件方法
	public void addSwitchListener(SwitchListener switchListener){
		
		if(listeners == null){
			listeners = new HashSet();
		}
		
		listeners.add(switchListener);
	}
	
	//添加移除事件方法
	public void removeSwitchListener(SwitchListener switchListener){
		
		if(listeners == null){
			return;
		}
		
		listeners.remove(switchListener);
	}
	
	/**
	 * 
	 * @param switchEvent 事件对象,在Swing编程中一盘是由系统底层创建并传入的
	 * 一个开门事件
	 */
	public void openDoor(SwitchEvent switchEvent){
		
		if(listeners == null){
			return;
		}
		notifyListeners(switchEvent, "open");
	}
	
	/**
	 * 
	 * @param switchEvent 事件对象,在Swing编程中一盘是由系统底层创建并传入的
	 * 一个关门事件
	 */
	public void closeDoor(SwitchEvent switchEvent){
		
		if(listeners == null){
			return;
		}
		notifyListeners(switchEvent, "close");
	}
	
	/**
	 * 
	 * @param switchEvent 传入的事件对象
	 * @param eventType   事件的具体类型,用来判断调用事件的什么方法。
	 */
	private void notifyListeners(SwitchEvent switchEvent,String eventType){
		Iterator iter = listeners.iterator();
        while (iter.hasNext()) {
        	SwitchListener listener = (SwitchListener) iter.next();
            if(eventType.equals("open")){
            	listener.oper(switchEvent);
            	return;
            }
        	if(eventType.equals("close")){
        		listener.close(switchEvent);
            	return;
        	}
        }
	}
}

四、接下来就在主函数中测试一下,这里直接在主函数中手动触发事件,请根据实际情况做相应处理。

package com.yzl.main;

import com.yzl.event.SwitchEvent;
import com.yzl.eventsource.Door;
import com.yzl.listener.SwitchListener;

public class DoorMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建一个门
		Door door = new Door();
		//我是管家,我对门添加一个监听
		door.addSwitchListener(new SwitchListener() {
			
			@Override
			public void oper(SwitchEvent switchEvent) {
				// TODO Auto-generated method stub
				System.out.println("管家说:欢迎您:" + switchEvent.getName());
			}
			
			@Override
			public void close(SwitchEvent switchEvent) {
				// TODO Auto-generated method stub
				System.out.println("管家说:" + switchEvent.getName() + "您慢走!");
			}
		});
		
		//我是主人,我对门添加一个监听
		door.addSwitchListener(new SwitchListener() {
			
			@Override
			public void oper(SwitchEvent switchEvent) {
				// TODO Auto-generated method stub
				System.out.println("主人说:" + switchEvent.getName() + ",你来啦!");
			}
			
			@Override
			public void close(SwitchEvent switchEvent) {
				// TODO Auto-generated method stub
				System.out.println("主人说:" + switchEvent.getName() + ",再见!");
			}
		});
		
		//这个触发事件的方法,这步在Swing中是由JDK来完成的。
		SwitchEvent switchEvent = new SwitchEvent(new DoorMain(),"郝健");
		door.openDoor(switchEvent);
		SwitchEvent switchEvent1 = new SwitchEvent(new DoorMain(),"大鹏");
		door.openDoor(switchEvent1);
		//离开
		door.closeDoor(switchEvent);
		door.closeDoor(switchEvent1);
	}

}

执行结果:

主人说:郝健,你来啦!
主人说:大鹏,你来啦!
主人说:郝健,再见!
主人说:大鹏,再见!



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值