`

JavaBean事件机制

    博客分类:
  • Java
阅读更多

 

JavaBean 的事件  


一、事件概述

 

事件处理是JavaBean体系结构的核心之一。通过事件处理机制,可让一些组件作为事件源,发出可被描述环境或其它组件接收的事件。这样,不同的组件就可在构造工具内组合在一起,组件之间通过事件的传递进行通信,构成一个应用。从概念上讲,事件是一种在"源对象"和"监听者对象"之间,某种状态发生变化的传递机制 。事件有许多不同的用途,例如在Windows系统中常要处理的鼠标事件、窗口边界改变事件、键盘事件等。在Java和JavaBean中则是定义了一个一般的、可扩充的事件机制。

 

主要构成有:

事件从事件源到监听者的传递是通过对目标监听者对象的 Java 方法调用进行的。 对每个明确的事件的发生,都相应地定义一个明确的 Java 方法。这些方法都集中定义在事件监听者( EventListener )接口中,这个接口要继承 java.util.EventListener 实现了事件监听者接口中一些或全部方法的类就是事件监听者。 伴随着事件的发生,相应的状态通常都封装在事件状态对象中,该对象必须继承自 java.util.EventObject 。事件状态对象作为单参传递给对应响应该事件的监听者方法中。 发出某种特定事件的事件源的标识是:遵从规定的设计格式为事件监听者定义注册方法,并接受对指定事件监听者接口实例的引用。 有时,事件监听者不能直接实现事件监听者接口,或者还有其它的额外动作时,就要在一个源与其它一个或多个监听者之间插入一个事件适配器类的实例,来建立它们之间的联系。  


二、事件状态对象( Event State Object

 

与事件发生有关的状态信息一般都封装在一个事件状态对象中 ,这种对象是 java.util.EventObject 的子类。

public class EventObject implements java.io.Serializable {

    //事件源
    protected transient Object  source;

    public EventObject(Object source) {
	if (source == null)
	    throw new IllegalArgumentException("null source");

        this.source = source;
    }

    public Object getSource() {
        return source;
    }

    public String toString() {
        return getClass().getName() + "[source=" + source + "]";
    }
}
 

按设计习惯,这种事件状态对象类的名应以 Event 结尾。

例如:

package javabeanevent;

import java.awt.Point;

public class MouseMovedExampleEvent extends java.util.EventObject {

	protected int x, y;

	/* 创建一个鼠标移动事件MouseMovedExampleEvent */

	MouseMovedExampleEvent(java.awt.Component source, Point location) {

		super(source);

		x = location.x;

		y = location.y;

	}

	/* 获取鼠标位置*/

	public Point getLocation() {

		return new Point(x, y);
	}
}

 

 

三、事件侦听者接口( EventListener Interface )与事件侦听者

   

由于Java 事件模型是基于方法调用,因而需要一个定义并组织事件操纵方法的方式。JavaBean 中,事件操纵方法都被定义在继承了java.util.EventListener 类的EventListener 接口中,它是一个标志性接口,源码如下:

public interface EventListener {
}
 

按规定,EventListener 接口的命名要以Listener 结尾。任何一个类如果想操纵在EventListener 接口中定义的方法都必须以实现这个接口方式进行。这个类也就是事件监听者。

package javabeanevent;

/* 定义了鼠标移动事件的监听者接口 */
interface MouseMovedExampleListener extends java.util.EventListener {
	/* 在这个接口中定义了鼠标移动事件监听者所应支持的方法*/
	void mouseMoved(MouseMovedExampleEvent mme);
}
 

在接口中只定义方法名,方法的参数和返回值类型。如:上面接口中的mouseMoved 方法的具体实现是在下面的ArbitraryObject 类中定义的。

package javabeanevent;

public class ArbitraryObject implements MouseMovedExampleListener {
	public void mouseMoved(MouseMovedExampleEvent mme) {
		//...
	}
}

 

  ArbitraryObject 就是MouseMovedExampleEvent 事件的监听者。

 

四、事件侦听者的注册与注销

   

为了各种可能的事件监听者把自己注册入合适的事件源中,建立源与事件监听者间的事件流,事件源必须为事件监听者提供注册和注销的方法。

 

public void add< ListenerType>(< ListenerType> listener)

public void remove< ListenerType>(< ListenerType> listener)

 

例如: 
  首先定义了一个事件监听者接口:

 

package javabeanevent;

import java.util.EventObject;

public interface ModelChangedListener extends java.util.EventListener {
	void modelChanged(EventObject e);
}

 接着定义事件源类:

package javabeanevent;

import java.util.EventObject;
import java.util.Vector;

public abstract class Model {
	private Vector listeners = new Vector(); // 定义了一个储存事件监听者的数组 

	/*上面设计格式中的< ListenerType>在此处即是下面的ModelChangedListener*/
	public synchronized void addModelChangedListener(ModelChangedListener mcl) {
		listeners.addElement(mcl);
	}//把监听者注册入listeners数组中 

	public synchronized void removeModelChangedListener(ModelChangedListener mcl) {
		listeners.removeElement(mcl); //把监听者从listeners中注销 
	}

	/*以上两个方法的前面均以synchronized,是因为运行在多线程环境时,可能同时有几个对象同时要进行注册和注销操作,使用synchronized来确保它们之间的同步。开发工具或程序员使用这两个方法建立源与监听者之间的事件流*/
	protected void notifyModelChanged() {
		/*事件源使用本方法通知监听者发生了modelChanged事件*/
		Vector l;
		EventObject e = new EventObject(this);
		/* 首先要把监听者拷贝到l数组中,冻结EventListeners的状态以传递事件。
		 * 这样来确保的在循环发送事件时,即使其它线程对监听者集合进行了增删,也不会
		 * 影响原来需要触发的监听者集合。这里的同步块只是在拷贝时同步,在调用时没同步,
		 * 因为调用监听者方法或能是个长方法,所以先拷贝*/
		synchronized (this) {
			l = (Vector) listeners.clone();
		}
		for (int i = 0; i < l.size(); i++) {
			/* 依次通知注册在监听者队列中的每个监听者发生了modelChanged事件, 
			并把事件状态对象e作为参数传递给监听者队列中的每个监听者*/
			((ModelChangedListener) l.elementAt(i)).modelChanged(e);
		}
	}
}
 

分享到:
评论

相关推荐

    JavaBean的事件

    ### JavaBean中的事件处理机制详解 #### 一、引言 在Java开发中,JavaBean是一种遵循特定编码规范的对象,通常用于封装数据属性以及相关的业务逻辑。JavaBean的设计模式不仅支持封装,还提供了事件处理机制,这...

    JavaBean课件.rar

    5. **事件处理**:JavaBean可能支持事件监听机制,允许其他组件订阅并响应Bean的特定事件。 在Java开发中,JavaBean广泛应用于MVC(Model-View-Controller)架构,特别是在Web应用中。它们可以作为模型层的实体,...

    javabean源码

    - **事件处理**:JavaBean可以支持事件监听机制,与其他组件进行交互。 3. **JavaBean的创建**: 创建JavaBean时,一般遵循以下步骤: - 定义一个公共类,类名通常以"Bean"结尾。 - 在类中定义私有属性,用于...

    简单身份验证JAVABEAN的设计

    JavaBean 的操作原理是通过反射机制来实现的。用户通过浏览器发送请求,请求到达服务器后,在服务器端查找对应的网页,如果是首次请求, JSP 将生成 Servlet,然后通过 Servlet 引擎来执行 Servlet,把调用 ...

    javabean概念和使用

    众所周知,属性名称符合这种模式,其他 Java 类可以通过自身机制发现和操作这些 JavaBean 属性。 JavaBean 的基本概念 JavaBean 是一种可复用的平台独立的软件组件,开发者可以在软件构造器工具中其直接进行可视化...

    javaBean简介.doc

    【JavaBean 简介】 JavaBean 是 Java 编程语言中的一种特殊类,它遵循特定的编程规范,主要用于封装数据...尽管在现代开发环境中,其使用方式有所变化,但理解JavaBean的基本概念和机制仍然是学习Java Web开发的基础。

    使用JavaBean扩展Forms功能

    例如,我们在Form的“Initialize”事件中实例化JavaBean,并在按钮的“When Button Pressed”事件中调用`performBusinessLogic`方法: ```plsql DECLARE myBean VBean.Property; BEGIN -- 初始化JavaBean myBean...

    JavaBean讲解(上)

    4. 反射机制:JavaBean的属性、事件和方法可以通过反射API动态访问,增强了程序的灵活性。 使用JavaBean的场景: 1. MVC架构:在Model部分,JavaBean用于封装业务逻辑和数据,与View和Controller进行交互。 2. JSP...

    01_JavaBean讲解(上)2

    3. **Introspector组件**:Java内置的Introspector类可以自动发现JavaBean的属性、事件和方法,这对于构建用户界面或自动化工具非常有用。 4. **BeanInfo类**:扩展JavaBean的元数据信息,可以自定义默认的行为和...

    javabean和xml互相转换工具类以及jar包

    - **SAX(Simple API for XML)**:非回溯事件驱动的解析方式,根据XML事件调用相应的处理函数,逐个设置JavaBean的属性。 - **JAXB反序列化**:使用JAXBContext的Unmarshaller对象,可以直接将XML文件或输入流转...

    javabean BDK

    2. **事件模拟**:允许开发者触发 JavaBean 的属性变化事件,观察相应的处理逻辑。 3. **可视化设计**:可能包含一个可视化界面,使得开发者可以通过拖拽方式创建和编辑 JavaBean,类似于 IDE 中的 Bean Inspector。...

    清华大学javaBean课件

    JavaBean事件处理机制是其核心特点之一,允许组件作为事件源发出事件,被其他组件(如事件监听者)接收并响应。事件监听者通过实现`EventListener`接口,当事件发生时,事件状态对象(通常是`EventObject`的子类,如...

    JavaBean技术

    3. **无参构造函数**:JavaBean必须有一个公共的无参构造方法,这是为了让反射机制能够正常工作。 4. **公共的get/set方法**:对于私有字段,需要提供公共的getter和setter方法,这些方法通常命名为`getXXX`和`...

    javabean记事本

    2. **事件处理**:在JavaBean记事本中,可能会涉及到事件监听和处理,例如点击菜单项或按钮触发相应的操作。这通常通过实现Listener接口(如ActionListener)并添加到事件源(如JButton)上来实现。 3. **Swing组件...

    java 根据javaBean反射自定义导出 excel、xml、pdf、csv

    在Java编程中,根据JavaBean反射来实现数据的导出,如...总之,JavaBean结合反射机制可以灵活地处理数据,而通过各种库支持,我们可以方便地将数据导出到Excel、XML、PDF和CSV等多种格式,满足不同的数据交换需求。

    JavaBean和JSP中的标准动作

    5. **属性的自省机制**:Java 提供了 introspection API,允许程序在运行时检查类的属性、方法和构造器,使得其他组件可以动态地了解和操作 JavaBean。 在 JSP 中,JavaBean 可以通过以下几种标准动作来使用: 1. ...

    javaBean.rar

    2. **反射机制** 在描述中提到的“通过反射实现”指的是Java的反射API。反射允许我们在运行时检查类、接口、字段和方法的信息,并能在运行时创建和访问Java对象。在这个场景下,反射被用来动态地获取JavaBean的属性...

    黑马程序员-----javaBean的操作类学习笔记

    - JavaBeans可以实现事件监听机制,通过发布和订阅事件来与其他组件通信。例如,`ActionListener`接口常用于按钮点击事件。 6. **Introspector类**: - Java的`Introspector`类可以用来获取JavaBean的元信息,如...

    通过Java反射机制获取JavaBean对象

    1.通过Java反射机制获取JavaBean对象。 2.通过JavaBean全路径字符串获取JavaBean对象。 3.获取JavaBean注解信息

Global site tag (gtag.js) - Google Analytics