网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  全面介绍java事件处理与发送     
  文章作者:未知  文章来源:水木森林  
  查看:56次  录入:管理员--2007-11-17  
 
  任何时候,按下键盘或鼠标的键就产生了事件。组件接受和处理事件的方式自jdk1.1以来都保持不变。swing组件能够产生许多不同类别的事件,包括那些在java.awt.event包以及在javax.swing.event包中的事件。swing新引入的那些事件类别往往是与特定swing组件相关的。每一个事件类别都是一个对象,它至少指明了事件的发生源,往往还带有其它消息,如该事件的类别、在事件发生前和发生后事件源状态的变化,等等。事件源大部分是普通的组件或模型(models, 即mvc中的m,在以后的blog中可能会介绍swing组件的mvc结构)。其它的对象也可能产生事件。
  
  要想收到事件产生的通知,我们需要在目标对象上注册事件监听器。事件监听器是任意xxlistener类或接口的具体实现(xx代指事件的类型)。xxlistener是定义在java.awt.event、java.beans和javax.swing.event包中的类或接口。在每个接口中至少定义了一个方法(method),该方法以对应的xxevent作为参数。支持发送xxevent事件发生通知的类都须实现xxlistener接口,同时提供相应的addxxlistener()和removexxlistener()方法来注册和移除这些事件监听器,大部分的事件目标对象(target)都允许注册任意多个事件监听器。通常支持xxevent的类都提供受保护的方法(protected method)firexx()来构造事件对象及将它送至事件处理器(event handler)进行处理。
  
  javax.swing.event.eventlistenerlist类
  
  eventlistenerlist是一个包含xxevent/xxlistener对(pairs)的阵列(数组)。jcomponent及其派生类使用一个eventlistenerlist对象来维护其事件监听器。所有默认的模型(models)同样维护事件监听器和一个eventlistenerlist。当一个监听器被注册到一个swing组件或模型(model)时,对应的事件的class实例(用来标识事件类别)被添加至eventlistenerlist阵列,后面紧随该监听器本身(即一个xxevent/xxlistener对)。因为这些对是储存在阵列而不是在可变的集合(mutable collection)中(出于对效率的考虑),每一次添加和移除都会调用system.arraycopy()来生成一个新的阵列。当收到事件时,阵列被遍历,事件就会被送至拥有其类型的每一个事件监听器。由于阵列是按xxevent, xxlistener, yyevent, yylistener, ... 的方式排列的,某个事件类别的监听器总是紧随其后。这种方式使得事件处理十分高效。为了线程安全,当从eventlistenerlist添加和移除监听器时,方法访问阵列必须同步。
  
  jcomponent定义了一个名为listenerlist的受保护eventlistlistener属性,因而所有它的子类都继承了这个属性。swing组件直接透过listenerlist属性来管理其大部分事件监听器。
  
  事件发送线程
  
  事件监听器在事件发送线程(一个java.awt.eventdispatchthread类的实例)中接受并处理事件。所有的绘制和组件布局也被要求在此线程中发生。事件发送线程在awt和swing中具有头等的重要性,在应用中控制组件状态和显示的随时更新方面扮演着关键的角色。
  
  与此线程相关的是一个事件的fifo(first in first out,先进先出)队列:系统事件队列(java.awt.eventqueue的一个实例)。跟所有的fifo队列一样,系统事件队列也是被线性填充的。无论是更新组件属性,布局,或是重新绘制,每一个请求依次运行事件处理代码。所有事件被依次处理是为了避免像某个组件的状态在它重新绘制的中途被意外改变这样的情况。知道这一点后,我们就要避免在事件发送线程之外去发送事件。比如说,在另一个线程中直接调用firexx()方法就是不安全的。我们同时也必须保证事件处理代码和绘制代码尽快地执行完,否则整个系统队列就会被阻塞,被迫等待某个事件被处理,重新绘制,或是布局完毕,而我们的应用程序则像是被“冻结”或是失去响应。
  ==============================================================================================
  // thanks to matthew robinson and pavel vorobiev, ph.d for their great book swing, this article is translated form
  // this book, 1st edition. you can find these text in their book (in english) of chapter 2.
  =================================================================================
  
  要想收到事件产生的通知,我们需要在目标对象上注册事件监听器。事件监听器是任意xxlistener类或接口的具体实现(xx代指事件的类型)。xxlistener是定义在java.awt.event、java.beans和javax.swing.event包中的类或接口。在每个接口中至少定义了一个方法(method),该方法以对应的xxevent作为参数。支持发送xxevent事件发生通知的类都须实现xxlistener接口,同时提供相应的addxxlistener()和removexxlistener()方法来注册和移除这些事件监听器,大部分的事件目标对象(target)都允许注册任意多个事件监听器。通常支持xxevent的类都提供受保护的方法(protected method)firexx()来构造事件对象及将它送至事件处理器(event handler)进行处理。
  
  javax.swing.event.eventlistenerlist类
  
  eventlistenerlist是一个包含xxevent/xxlistener对(pairs)的阵列(数组)。jcomponent及其派生类使用一个eventlistenerlist对象来维护其事件监听器。所有默认的模型(models)同样维护事件监听器和一个eventlistenerlist。当一个监听器被注册到一个swing组件或模型(model)时,对应的事件的class实例(用来标识事件类别)被添加至eventlistenerlist阵列,后面紧随该监听器本身(即一个xxevent/xxlistener对)。因为这些对是储存在阵列而不是在可变的集合(mutable collection)中(出于对效率的考虑),每一次添加和移除都会调用system.arraycopy()来生成一个新的阵列。当收到事件时,阵列被遍历,事件就会被送至拥有其类型的每一个事件监听器。由于阵列是按xxevent, xxlistener, yyevent, yylistener, ... 的方式排列的,某个事件类别的监听器总是紧随其后。这种方式使得事件处理十分高效。为了线程安全,当从eventlistenerlist添加和移除监听器时,方法访问阵列必须同步。
  
  jcomponent定义了一个名为listenerlist的受保护eventlistlistener属性,因而所有它的子类都继承了这个属性。swing组件直接透过listenerlist属性来管理其大部分事件监听器。
  
  事件发送线程
  
  事件监听器在事件发送线程(一个java.awt.eventdispatchthread类的实例)中接受并处理事件。所有的绘制和组件布局也被要求在此线程中发生。事件发送线程在awt和swing中具有头等的重要性,在应用中控制组件状态和显示的随时更新方面扮演着关键的角色。
  
  与此线程相关的是一个事件的fifo(first in first out,先进先出)队列:系统事件队列(java.awt.eventqueue的一个实例)。跟所有的fifo队列一样,系统事件队列也是被线性填充的。无论是更新组件属性,布局,或是重新绘制,每一个请求依次运行事件处理代码。所有事件被依次处理是为了避免像某个组件的状态在它重新绘制的中途被意外改变这样的情况。知道这一点后,我们就要避免在事件发送线程之外去发送事件。比如说,在另一个线程中直接调用firexx()方法就是不安全的。我们同时也必须保证事件处理代码和绘制代码尽快地执行完,否则整个系统队列就会被阻塞,被迫等待某个事件被处理,重新绘制,或是布局完毕,而我们的应用程序则像是被“冻结”或是失去响应。
  ==============================================================================================
  // thanks to matthew robinson and pavel vorobiev, ph.d for their great book swing, this article is translated form
  // this book, 1st edition. you can find these text in their book (in english) of chapter 2.
  =================================================================================
  
  要想收到事件产生的通知,我们需要在目标对象上注册事件监听器。事件监听器是任意xxlistener类或接口的具体实现(xx代指事件的类型)。xxlistener是定义在java.awt.event、java.beans和javax.swing.event包中的类或接口。在每个接口中至少定义了一个方法(method),该方法以对应的xxevent作为参数。支持发送xxevent事件发生通知的类都须实现xxlistener接口,同时提供相应的addxxlistener()和removexxlistener()方法来注册和移除这些事件监听器,大部分的事件目标对象(target)都允许注册任意多个事件监听器。通常支持xxevent的类都提供受保护的方法(protected method)firexx()来构造事件对象及将它送至事件处理器(event handler)进行处理。
  
  javax.swing.event.eventlistenerlist类
  
  eventlistenerlist是一个包含xxevent/xxlistener对(pairs)的阵列(数组)。jcomponent及其派生类使用一个eventlistenerlist对象来维护其事件监听器。所有默认的模型(models)同样维护事件监听器和一个eventlistenerlist。当一个监听器被注册到一个swing组件或模型(model)时,对应的事件的class实例(用来标识事件类别)被添加至eventlistenerlist阵列,后面紧随该监听器本身(即一个xxevent/xxlistener对)。因为这些对是储存在阵列而不是在可变的集合(mutable collection)中(出于对效率的考虑),每一次添加和移除都会调用system.arraycopy()来生成一个新的阵列。当收到事件时,阵列被遍历,事件就会被送至拥有其类型的每一个事件监听器。由于阵列是按xxevent, xxlistener, yyevent, yylistener, ... 的方式排列的,某个事件类别的监听器总是紧随其后。这种方式使得事件处理十分高效。为了线程安全,当从eventlistenerlist添加和移除监听器
 
 
上一篇: 访谈:为java菜鸟帮解答问题二十例    下一篇: 新手入门:j2ee学习经验和流程
  相关文档
基础:j2ee程序员应该掌握的linux知识 12-10
Java入门:java类文件详解 03-25
递归函数之java演绎 11-17
图解jdeveloper 10g快速开发会话ejb(下) 11-17
小议局部类 11-16
php和java 11-17
用jdo替代cmp的应用 11-17
采用 javadoc 形式的集成文档有利有弊 11-17
基于 j2ee 体系实现多层结构 blog 平台(2) 11-17
探索java应用程序的安全需求 11-17
进阶:使用浮点数和小数中的技巧和陷阱 02-28
j2ee基础:java web三层架构的配置详解 11-19
加速工具软件&总结 11-17
java中的vector 11-17
java servlet api说明文档(2.1a版) 11-17
修正java中wait方法超时语意模糊性的一种方案 11-17
3d建模技巧 11-17
正则表达式常用功能—查询提取替换分割 11-17
totimestring 方法 11-16
java核心代码例程之:javamail ----popmail.java 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息