Java事件机制包括三个部分:事件、事件监听器、事件源。其中事件类中包含事件源的实例,来标识事件的发出者;事件监听器类则包含了事件被触发时的响应函数,业务逻辑写在该响应函数中;而事件源则有一个事件监听器列表,当事件触发时,通知所有的监听者,采用的是观察者模式 (发布-订阅模式)。
1、事件类。一般继承自java.util.EventObject类,封装了事件源对象及跟事件相关的信息。
import java.util.EventObject; /** * @Title: ValueChangeEvent.java * @Package * @Description: * @author Mr.Simple [email protected] * @date Apr 5, 2013 2:10:39 PM * @version V1.0 */ /** * 事件类,包含了事件源 * @ClassName: ValueChangeEvent * @Description: * @author Mr.Simple * @date Apr 5, 2013 2:12:37 PM * */ public class ButtonClickEvent extends EventObject { /** * 字段: */ private static final long serialVersionUID = 1L; // 事件源 private Object mSourceObject = null; private String mTag = ""; /** * 构造函数 * @param sObject */ public ButtonClickEvent(Object sObject){ super(sObject); mSourceObject = sObject; } /** * 构造函数 * @param sObject * @param tag */ public ButtonClickEvent(Object sObject, String tag){ super(sObject); mSourceObject = sObject; mTag = tag; } /** * 获取事件源 * (non-Javadoc) * @see java.util.EventObject#getSource() */ public Object getSource() { return mSourceObject; } /** * * @Title: setSource * @Description: 设置事件源 * @param obj * @return void * @throws */ public void setSource(Object obj) { mSourceObject = obj; } /** * * @Title: getTag * @Description: 获得tag * @return * @return String * @throws */ public String getTag(){ return mTag; } /** * * @Title: setTag * @Description: 设置tag * @param tag * @return void * @throws */ public void setTag(String tag) { mTag = tag; } }
/** * * @ClassName: ButtonClickListenerInner * @Description: 内部类的写法 * @author Mr.Simple * @date Apr 5, 2013 2:41:02 PM * */ private static class ButtonClickListenerInner implements EventListener{ /** * * @Title: ItemClicked * @Description: 点击事件 * @param event * @return void * @throws */ public void ButtonClicked(ButtonClickEvent event ) { // 获取事件源 ButtonDemo source = (ButtonDemo)event.getSource(); System.out.println("内部静态监听类@_@ 你点击的是 : " + source.getItemString()) ; } }
3、事件源。事件触发的地方,由于事件源的某项属性或状态发生了改变(比如Button被单击等)导致某项事件发生。换句话说就是生成了相应的事件对象。因为事件监听器要注册在事件源上,所以事件源类中应该含有用来存储事件监听器的容器(List,Set等等)。
/** * * @ClassName: ListViewDemo * @Description: 事件源模拟类,采用的是观察者模式 * @author Mr.Simple * @date Apr 5, 2013 2:18:34 PM * */ public class ButtonDemo { // item文本文字 private String mItemName = ""; // 监听器哈希集合,可以注册多个监听器 private Set<EventListener> mClickListeners = null ; /** * 构造函数 * */ public ButtonDemo(){ // 监听器列表 mClickListeners = new HashSet<EventListener>(); mItemName = "Defualt Item Name"; } /** * 构造函数 * @param itemString */ public ButtonDemo(String itemString){ mItemName = itemString; mClickListeners = new HashSet<EventListener>(); } /** * * @Title: AddItemClickListener * @Description: 添加监听器 * @param listener * @return void * @throws */ public void AddItemClickListener(EventListener listener){ // 添加到监听器列表 this.mClickListeners.add(listener) ; } /** * * @Title: ItemClick * @Description: 模拟点击事件,触发事件则通知所有监听器 * @return void * @throws */ public void ButtonClick() { // 通知所有监听者 Notifies() ; } /** * * @Title: Notifies * @Description: 通知所有监听者 * @return void * @throws */ private void Notifies() { Iterator<EventListener> iterator = mClickListeners.iterator(); while (iterator.hasNext()) { // 获取当前的对象 ButtonClickListenerInner listener = (ButtonClickListenerInner) iterator.next(); // 事件触发,事件的构造函数参数为事件源 listener.ButtonClicked(new ButtonClickEvent(this)); } } /** * * @Title: getItemString * @Description: 返回该项的名字 * @return String * @throws */ public String getItemString() { return mItemName; } /** * * @Title: main * @Description: main方法 * @param args * @return void * @throws */ public static void main(String[] args) { ButtonDemo buttonDemo = new ButtonDemo("Hello, I am a ButtonDemo") ; // 添加监听器 buttonDemo.AddItemClickListener(new ButtonClickListenerInner()) ; // 事件触发 buttonDemo.ButtonClick(); }
输出结果如下 :
下载链接 : http://download.csdn.net/detail/bboyfeiyu/5222920