Java事件第2篇

假如现在有一个Button按钮,Button按钮上有click和doubleclick事件。两个不同的事件需要进行不同的处理,这时候就需要为相应的事件注册Listener了。修改后的目录组织结构如下:

1、事件基本类的编写如下:

package com.event.test02;

public class Event {

	public String action; // 事件名称
	public String message; // 附加说明

	/**
	 * @param action
	 * @param message
	 */
	public Event(String action, String message) {
		this.action = action;
		this.message = message;
	}
}
package com.event.test02;

public class EventNames {
	/**
	 * 单击事件
	 */
	public static final String Click = "Click";

	/**
	 * 双击事件
	 */
	public static final String DoubleClick = "DoubleClick";
}
package com.event.test02;

import com.event.test02.exception.EventAlreadyRegisteredException;
import com.event.test02.handler.ClickHandler;
import com.event.test02.handler.DoubleClickHandler;

public class EventBinder {
	public static void bindEvents(){
		try {
			EventDispatcher eventDispatcher = EventDispatcher.getInstance();
			eventDispatcher.addEventListener(EventNames.Click, new ClickHandler());
			eventDispatcher.addEventListener(EventNames.DoubleClick, new DoubleClickHandler());
		} catch (EventAlreadyRegisteredException e) {
			e.printStackTrace();
		}
	}

}
package com.event.test02;

import java.util.HashMap;

import com.event.test02.exception.EventAlreadyRegisteredException;
import com.event.test02.exception.UnknowEventException;
import com.event.test02.handler.EventListener;

public class EventDispatcher {

	private static EventDispatcher eventDispatcher;

	private EventDispatcher(){}

	/**
	 * 获取实例
	 * @return EventDispatcher
	 */
	public static EventDispatcher getInstance(){
		if(eventDispatcher == null){
			eventDispatcher = new EventDispatcher();
		}
		return eventDispatcher;
	}

    HashMap<String, EventListener> map = new HashMap<String, EventListener>();

    /**
     * 添加监听器
     * @param event
     * @param listener
     * @throws EventAlreadyRegisteredException
     */
    public void addEventListener(String event, EventListener listener)
    	throws EventAlreadyRegisteredException {
    	if(map.get(event) != null){
			throw new EventAlreadyRegisteredException();
    	}
    	map.put(event, listener);
    }

    /**
     * 移除某一个监听器
     * @param event
     */
    public void removeEventListener(String event) {
    	map.remove(event);
    }

    /**
     * @param e
     * @throws UnknowEventException
     */
    public void dispatchEvent(Event e) throws UnknowEventException {
    	EventListener listener = map.get(e.action);
    	if(listener == null){
    		throw new UnknowEventException();
    	}else{
    		listener.handleEvent(e);
    	}
    }

    /**
     * 移除所有监听器
     */
    public void removeAllListeners() {
    	map.clear();
    }

}

2、监听器类的编写如下

package com.event.test02.handler;

import com.event.test02.Event;

public interface EventListener {
	public void handleEvent(Event e);
}
package com.event.test02.handler;

import com.event.test02.Event;

public class DoubleClickHandler implements EventListener{

	public void handleEvent(Event e) {
		System.out.println("hand  doubleclick event ....");
	}
}
package com.event.test02.handler;

import com.event.test02.Event;

public class ClickHandler implements EventListener{

	public void handleEvent(Event e) {
		System.out.println("hand  click event ....");
	}
}

3、自定义异常处理类

package com.event.test02.exception;

public class EventAlreadyRegisteredException extends Exception {

	private static final long serialVersionUID = 741821449383395827L;

}
package com.event.test02.exception;

public class UnknowEventException extends Exception {
	private static final long serialVersionUID = 4829929946904208467L;
}

最后运行的结果如下:

hand  click event ....
hand  doubleclick event ....

如上的程序灵活了不少,其组织也非常清晰。在使用的时候不要拘泥于某一种形式。在实际项目开发的过程中,可以将许多大的操作封装为一个专门的任务Task,也可以启动若干个承担不同任务的线程。只要给这些任务定义一个事件名称,当需要执行某个任务时,利用事件触发即可。

Java事件第2篇,布布扣,bubuko.com

时间: 2025-01-24 13:39:18

Java事件第2篇的相关文章

Java事件机制

Java事件由事件类和监听接口组成,自定义一个事件前,必须提供一个事件的监听接口以及一个事件类.JAVA中监听接口是继承java.util.EventListener的类,事件类继承java.util.EventObject的类.很多基本的事件系统已经为我们定义好了,我们只要学会调用即可,但是为了更加灵活地满足特定的需求,我们有时候也需要自定义事件. 对于事件的理解:http://lyunabc.iteye.com/blog/1538940这篇博文讲的不错,有助于我们理解事件从产生到处理这一过程

39.JAVA编程思想之外篇——JAVA图形化设计精简大全一文覆盖

39.JAVA编程思想之外篇--JAVA图形化设计精简大全一文覆盖 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51204948 目录 Java图形化界面设计--容器(JFrame)...1 Java基本类(JFC)...1 l     AWTAbstract Window Toolkit(AWT)抽象窗口工具包... 2 l     Swing包... 2 l     AWT和Swing的区别... 6 Swing基本框

Java RMI之HelloWorld篇

Java RMI之HelloWorld篇 Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方法调用的任何对象必须实现该远程接口. Java RMI不是什么新技术(在Java1.1的时代都有了),但却是是非常重要的底层技术. 大名鼎鼎的EJB都是建立在rmi基础之上的,现在还有一些开源的远程调用组件,其底层技术也是rmi. 在大力鼓吹Web Serv

每天五个java相关面试题(10)--java基础详解篇2

好勒好勒.一起加油 一.HashMap和Hashtable的区别. 答: HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable. HashMap允许将null作为一个entry的key或者value,而Hashtable不允许. HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey.因

[Java 05 OO] (基础篇) 《Java开发实战经典》

p5OO 第五章 面向对象 (基础篇) Notes (1), Constructor / this / String   String str1 = "hello"; 解释 : 是把一个在堆内存空间的使用权给了 str1 对象.   String str2 = "hello"; str1 == str2 是 true   String 字符串的内容不可改变 (2), Java 常用的内存区域    1), 栈内存空间    2), 堆内存空间    3), 全局数据

学习java随笔第八篇:封装、继承、多态

java和c#一样都是面向对象的语言. 面向对象的语言有三大特征:封装.继承.多态 封装 封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别. class Person2 { private String name; public void setName(String name) { this.name=name; } public String getName() { return name; } private String sex; public voi

Java学习之Servlet篇

<JAVA遇见HTML——Servlet篇> Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁. init():在Servlet的生命周期中,仅执行一次init()方法.它是在服务器装入Servlet时执行的,负责初始化Servlet对象.可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet.无论有多少客户机访问Servlet,都不会重复执行init(). service():它是Servlet的核心,负责响应客

学习java随笔第七篇:java的类与对象

类 同一个包(同一个目录),类的创建与调用 class Man{ String name; void GetMyName() { System.out.println(name); } } public class Person { public static void main(String arges[]) { Man m=new Man(); m.name="小黄"; m.GetMyName(); } } 运行结果 不同的包(不同目录目录),类的创建与调用 package Peo

学习java随笔第六篇:数组

一维数组 创建一维数组并输出 public class OneDimensionalArray { public static void main(String argas[]) { int i[]=new int[10]; for(int j=0;j<i.length;j++) { i[j]=j; System.out.println(i[j]); } } } 多维数组 创建多维数组并输出 public class MultiDimensional { public static void m