事件驱动模型实例详解(JAVA篇)
JAVA事件处理机制

14
使用事件监听器类
import java.awt.*; public class TestButton{ public static void main(String args[ ]) { Frame f = new Frame(“Test”); Button b = new Button(“Press Me!”); b.addActionListener(new ButtonHandler( )); f.add(b, “Center”); f.pack( ); f.setVisible(true) ; } }
12
事件监听器类的编写要点
事件监听器类应该包括以下两部分内容: 事件监听器类应该包括以下两部分内容: 1.在事件监听器类的声明中指定要实现的监听器接口名,如: 在事件监听器类的声明中指定要实现的监听器接口名, 在事件监听器类的声明中指定要实现的监听器接口名 public class MyListener implements XxxListener { … } 2.实现监听器接口中的事件处理方法,如: 实现监听器接口中的事件处理方法, 实现监听器接口中的事件处理方法 public void 事件处理方法名(XxxEvent e) { ...//处理某个事件的代码... } 然后,在一个或多个组件上可以进行监听器类的实例的注册。 然后,在一个或多个组件上可以进行监听器类的实例的注册。如: 组件对象.addXxxListener(MyListener对象);
5
事件处理机制的几个重要概念
注册事件监听器
为了能够让事件监听器检查某个组件(事件源) 是否发生了某些事件,并且在发生时激活事件 处理器进行相应的处理,必须在事件源上注册 事件监听器。这是通过使用事件源组件的以下 方法来完成的:
一种基于新型事件驱动机制的Java构件交互方法

中 分类 T 3 图 号: P1 1
一
种 基 于新型 事件 驱动 机制 的 J v a a构件 交互方法
羌翼亭 ,陈吴鹏
( 上海 交通 大学软件学院 ,上海 2 0 3 ) 0 0 0
摘
要 : 出了一种基于新 型事件 驱动机 制的构件交互方法 。这种方法使用统一 的事件模型 ,以一致 的方式处理各类 事件 ,包括 自 提 动触发
mo e , d l whih t a sk n fe e t t a l y i c u i g e e t i g r d a t ma i a l , v n s c e t d e pl i y u i g AP , n o t g e e t c e t i dso v n swih s n e wa , n l d n v n st g e e u o tc ly e e t r a e x i t sn I a d r u i v n s r r cl n fo e e t o t rt a e e t o t rsa e I d es t e d s u c o e mo i c to rtki g fe i l o t rn t r si t r c i n c r . t s o g t r m v n u e t f c sr u e t t . t o n’ n e o r e c d d f a i n o a n x b er u e e wo k a e a t o e I u h r h rl i l n o it h a e wa o s l e c mpo e ti t r c i n p o l m. sa n w y t o v o n n n e a to r b e
维普资讯
第 3 卷 第 l 期 3 5
事件驱动编程实验报告

一、实验目的1. 理解事件驱动编程的基本概念和原理。
2. 掌握事件驱动编程在Java环境下的实现方法。
3. 通过实验加深对事件驱动编程在实际应用中的理解。
二、实验环境1. 操作系统:Windows 102. 开发工具:Eclipse IDE3. 编程语言:Java三、实验内容1. 实验一:事件源、事件监听器和事件对象(1)实验目的:理解事件源、事件监听器和事件对象的概念,掌握它们在Java中的实现方法。
(2)实验步骤:1)创建一个按钮组件,并为其添加事件监听器;2)在事件监听器中,获取事件对象,并处理事件;3)验证事件驱动编程的基本原理。
(3)实验结果:成功创建按钮组件,并为按钮添加了事件监听器。
在事件监听器中获取事件对象,并处理事件,实现了事件驱动编程的基本功能。
2. 实验二:自定义事件和事件监听器(1)实验目的:理解自定义事件和事件监听器的概念,掌握它们在Java中的实现方法。
(2)实验步骤:1)创建一个自定义事件类,继承自java.util.EventObject;2)创建一个事件监听器接口,用于处理自定义事件;3)实现事件监听器接口,并在事件监听器中处理自定义事件;4)验证自定义事件和事件监听器的实现。
(3)实验结果:成功创建自定义事件类和事件监听器接口,并在事件监听器中处理自定义事件,实现了自定义事件和事件监听器的功能。
3. 实验三:事件驱动编程在图形用户界面中的应用(1)实验目的:理解事件驱动编程在图形用户界面中的应用,掌握其实现方法。
(2)实验步骤:1)创建一个图形用户界面,包括按钮、文本框等组件;2)为组件添加事件监听器,实现事件驱动编程;3)验证事件驱动编程在图形用户界面中的应用。
(3)实验结果:成功创建图形用户界面,并为组件添加了事件监听器。
在事件监听器中处理事件,实现了事件驱动编程在图形用户界面中的应用。
4. 实验四:事件驱动编程在网络编程中的应用(1)实验目的:理解事件驱动编程在网络编程中的应用,掌握其实现方法。
java eventbus入门案例

java eventbus入门案例Java的EventBus(事件总线)是一种用于组件间通信的框架。
它基于观察者模式,通过订阅者和发布者的机制,实现了解耦和异步通信的方式。
在一个事件总线中,发布者发布事件,而订阅者订阅感兴趣的事件并处理。
下面是几个使用Java EventBus的入门案例。
1. 创建事件类和订阅者类:首先需要创建一个事件类,该类用于定义需要发布的事件,例如创建一个名为MessageEvent的事件类,表示消息事件。
然后创建一个订阅者类,该类用于订阅感兴趣的事件并处理,例如创建一个名为MessageSubscriber的订阅者类。
2. 初始化EventBus:在应用程序的某个地方,需要初始化一个EventBus实例,例如在应用程序的入口处,使用EventBus.getDefault()方法获取一个默认的EventBus实例。
3. 注册订阅者:在需要订阅事件的地方,调用EventBus.register()方法将订阅者注册到EventBus中。
例如在应用程序的某个类中,调用EventBus.register(new MessageSubscriber())将MessageSubscriber注册到EventBus中。
4. 发布事件:在需要发布事件的地方,调用EventBus.post()方法发布事件。
例如在应用程序的某个类中,调用EventBus.post(new MessageEvent("Hello, World!"))发布一个消息事件。
5. 处理事件:订阅者类需要实现一个或多个用于处理事件的方法,这些方法需要使用@Subscribe注解进行标记。
例如在MessageSubscriber类中,可以定义一个用于处理消息事件的方法,使用@Subscribe注解标记该方法:```@Subscribepublic void handleMessageEvent(MessageEvent event) {System.out.println("Received message: " + event.getMessage());}```6. 反注册订阅者:在不再需要订阅事件的地方,调用EventBus.unregister()方法将订阅者从EventBus中反注册。
nio底层实现原理

nio底层实现原理一、引言nio(New I/O)是Java 1.4引入的一种新的I/O机制,它提供了一种非阻塞的、基于通道的I/O操作方式,相对于传统的I/O操作方式,在处理大量并发连接时具有更高的效率和可扩展性。
本文将介绍nio底层实现原理,帮助读者更好地理解和应用nio技术。
二、nio概述nio是Java对传统的阻塞式IO(BIO)的改进,它引入了新的抽象概念:通道(Channel)和缓冲区(Buffer)。
在传统的BIO中,每个连接都需要一个独立的线程来处理读写操作,当并发连接数较高时,线程资源消耗过大。
而nio则通过使用少量的线程来处理大量的并发连接,提高了系统的可扩展性。
三、nio底层实现原理1. 通道(Channel)通道是nio的核心概念之一,它代表与实体(如文件、网络套接字)之间的连接。
通道可以用于读取和写入数据,而且通道可以是双向的,即可以同时进行读写操作。
通道的实现类包括FileChannel、SocketChannel、ServerSocketChannel和DatagramChannel等。
2. 缓冲区(Buffer)缓冲区是nio的另一个核心概念,它是一个连续的、有限容量的数据存储区域。
在nio中,数据的读写都是通过缓冲区来实现的。
缓冲区提供了一系列的方法来操作数据,包括put、get、flip、clear 等。
nio中的缓冲区实现类包括ByteBuffer、CharBuffer、IntBuffer等。
3. 选择器(Selector)选择器是nio的另一个重要组件,它用于监听多个通道的事件,当某个通道发生了感兴趣的事件时,选择器就会通知应用程序进行处理。
通过使用选择器,应用程序可以使用较少的线程来处理大量的并发连接。
选择器的实现类为Selector。
4. 非阻塞式IO操作在传统的BIO中,当一个线程在执行IO操作时,如果没有数据可读,则会被阻塞,直到有数据可读。
而在nio中,可以通过设置通道为非阻塞模式来实现非阻塞式IO操作。
(完整版)构建模式

一:一个设计良好的通用模式往往是这个工程领域技术成熟的标志.1、管道过滤模式1)概述:每个功能模块都有一组输入和输出;功能模块对输入数据流进行增量计算得到输出数据流.功能模块称作过滤器filter;功能模块间的连接可看作输入、输出数据流之间的通路,称作管道。
2)特征:过滤器的相对独立性,即过滤器独立完成自身功能,相互之间无需进行状态交互。
整个管道过滤网络的最终输出和网络中各过滤器执行操作的顺序无关。
3)优点:(1)设计者可以将整个系统的输入、输出特性简单的理解为各个过滤器功能的合成;(2)管道过滤模式支持功能模块的复用;(3)管道过滤模式的系统具有较强的可维护性和可扩展性;(4)支持一些特定的分析,如吞吐量计算和死锁检测等;(5)管道过滤模式具有并发性。
4)不足:(1)管道过滤模式往往导致系统处理过程的成批操作;(2)设计者也许不得不花费精力协调两个相对独立但又存在某种关系的数据流;(3)根据实际设计的要求,设计者也需要对数据传输进行特定的处理,导致过滤器必须对输入、输出管道中的数据流进行解析或反解析,增加了过滤器具体实现的复杂性.5)管道过滤模式的实例:数字通信系统2、面向对象模式1)概述:面向对象模式集数据抽象、类继承为一体,使软件工程公认的模块化、信息隐藏、抽象、重用性等原则在面向对象模式下得以充分体现。
追求问题空间和软件系统空间的一致性。
基于面向对象模式构建系统,首先要确定求解问题中有哪些对象,构造适当的类以反映各种不同的对象,通过对象间传递消息和类的继承机制,协同完成对问题的求解.2)优点:(1)高度模块性;(2)封装功能;(3)代码共享;(4)灵活性;(5)易维护性;(6)可扩充性。
3)不足:在于如果一个对象需要调用另一个对象,它就必须知道那个对象的标识(对象名或其它标识符),这样就无形之中增强了对象之间的依赖关系。
4)实例ODS开放式分布系统 Open Distributed System构件:是一个封装了设计和实现的功能单元,它向外界提供接口,多个构件接口互连可以形成一个完整的系统。
spring事件驱动模型简介

spring事件驱动模型简介事件驱动模型也就是我们常说的观察者,或者发布-订阅模型;理解它的⼏个关键点:1. ⾸先是⼀种对象间的⼀对多的关系;最简单的如交通信号灯,信号灯是⽬标(⼀⽅),⾏⼈注视着信号灯(多⽅);2. 当⽬标发送改变(发布),观察者(订阅者)就可以接收到改变;3. 观察者如何处理(如⾏⼈如何⾛,是快⾛/慢⾛/不⾛,⽬标不会管的),⽬标⽆需⼲涉;所以就松散耦合了它们之间的关系。
接下来先看⼀个⽤户注册的例⼦:⽤户注册成功后,需要做这么多事:1、加积分2、发确认邮件3、如果是游戏帐户,可能赠送游戏⼤礼包4、索引⽤户数据…………问题:1. UserService和其他Service耦合严重,增删功能⽐较⿇烦;2. 有些功能可能需要调⽤第三⽅系统,如增加积分/索引⽤户,速度可能⽐较慢,此时需要异步⽀持;这个如果使⽤Spring,可以轻松解决,后边再介绍;从如上例⼦可以看出,应该使⽤⼀个观察者来解耦这些Service之间的依赖关系,如图:增加了⼀个Listener来解耦UserService和其他服务,即注册成功后,只需要通知相关的监听器,不需要关系它们如何处理。
增删功能⾮常容易。
这就是⼀个典型的事件处理模型/观察者,解耦⽬标对象和它的依赖对象,⽬标只需要通知它的依赖对象,具体怎么处理,依赖对象⾃⼰决定。
⽐如是异步还是同步,延迟还是⾮延迟等。
上边其实也使⽤了DIP(依赖倒置原则),依赖于抽象,⽽不是具体。
还是就是使⽤了IoC思想,即以前主动去创建它依赖的Service,现在只是被动等待别⼈注册进来。
其他的例⼦还有如GUI中的按钮和动作的关系,按钮和动作本⾝都是⼀种抽象,每个不同的按钮的动作可能不⼀样;如“⽂件-->新建”打开新建窗⼝;点击“关闭”按钮关闭窗⼝等等。
主要⽬的是:松散耦合对象间的⼀对多的依赖关系,如按钮和动作的关系;如何实现呢?⾯向接⼝编程(即⾯向抽象编程),⽽⾮⾯向实现。
Java面向对象程序设计案例教程课件:图形用户界面开发与事件处理

《Java面向对象程序设计案例教程》
7.2 Swing基础
• Swing组件是Java语言提供的第二代GUI设计工 具包,它以AWT为基础,在AWT内容的基础上 新增或改进了一些GUI组件,使得GUI程序功能 更强大,设计更容易、更方便。
• Swing与AWT有以下不同。
• (1) Swing是完全用Java语言编写的,所以称 Swing组件是轻量级组件,没有本地代码,不依 赖操作系统的支持,比AWT构件具有更强的实 用性。Swing在不同的平台表现一致,并且有能 力提供本地窗口系统不支持的其他特性。
《Java面向对象程序设计案例教程》 • Swing的类层次结构如图所示:
《Java面向对象程序设计案例教程》
• 3. 简单的范例 • 一个简单的Swing GUI应用程序。该程序生成一个窗
口, • 窗口中有一个标签,用于显示输出。 • (1) 程序代码: • 1. import java.awt.* ; • 2. import javax.swing.* ; • 3. public class SwingDemo • 4. { • 5. public static void main(String args[]) • 6. { • 7. JFrame fm = new JFrame("第一个Windows程序") ; • 8. JLabel label = new JLabel("这是第一个GUI程序") ;
• 教材例题7-12 利用组合框显示、选取地名。
• 教材例题8.2 ,例题8.3用不同方法生成JFrame窗口
《Java面向对象程序设计案例教程》
• 7.3.2 面板容器JPanel
• 面板JPanel也是Java中常用到的容器之一,面板是一种透明 的容器,既没有标题,也没有边框,就像一块透明的玻璃。 与JFrame不同,它不能作为最外层的容器单独存在,它首 先必须作为一个构件放置到其他容器中,然后再把它作为容 器,把其他构件放到其中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
假设用户单击了程序图形用户界面中的一个按钮,其实该按钮就是这个事件的源(可以引 发事件的物体)。所有的 Java Swing 对象都有感知自己被操作的能力,因此 JButton 按 钮也具有这样能力。一个事件通常必须有一个源对象,这里就是 JButton 对象。当单击按 钮时,JButton 组件类会生成一个用于存放该事件参数的 ActionEvent 的对象,该对象包 含了事件及事件源的信息。图 1-1 显示了这种机制。
btnPress.addActionListener (new ButtonEventHandler(this)); frame.getContentPane ().add(btnPress); frame.getContentPane ().add(txtMessage); }
侦听器创建的代码片断:
真正的事件处理代码片断:
/** * 按钮 btnPress 的事件处理方法。 *
* @param e 事件参数 */ private void btnPress_Click(ActionEvent e) {
String message = "你点击的按钮名叫:"
+ ((JButton) e.getSource()).getName(); this.txtMessage.setText(message); }
仅仅实现侦听器接口还不足以将侦听器对象连接到事件源上,仍需要把侦听器与希望处理 的事件单个源或多个源连接起来。通过调用事件源对象的特定方法,可以注册带有事件源 的侦听器对象。例如,为了注册侦听单击按钮事件的侦听器,需要调用 JButton 对象的 addActionListener()方法,该操作可以使侦听对象和事件源绑定。
3.事件处理就是这个人晕死了过去。
由于事件驱动模型在我们日常生活中是无处不在的, 因此 Java 和其他的编程语言都将这一 过程运用到了可视化编程中了。
2.Java 编程语言中的事件驱动模型
在 Java 编程技术中,最常用的可视化编程当属 Java Swing 技术,Java Swing 为开发者 提供了很多现成的组件,如:按钮(JButton),单选按钮(JRadioButton)等。为了管理 用户与组成程序图形用户界面的组件间的交互,必须理解在 Java 中如何处理事件。
6.How:在理解了集合框架的意义以后我们来看看如何来使用集合框架
当用户点击 btnPress 这个按钮的时候,按钮对象会直接把这次点击感觉传递给 ButtonEventHandler 的 actionPerformed 方法处理,为养成较好的编程习惯,我们中 心并不建议学员直接在该委托方法中编写代码,而是需要将该事件处理再次转发给窗体中 的某个方法来处理,这个方法的命名也必须是有规则的,就是事件源名+下划线+事件名 (btnPress_Click),并且该方法必须具有事件参数 ActionEvent,因为在该对象中明确指 明了,哪个按钮受到了点击了。e.getSource()方法返回了被点击按钮的对象,由于这次被 点击的是一个按钮,因此我们需要使用 JButton 对 e.getSource()的返回值进行强转,随
每个事件响应时只涉及到对该事件感兴趣的侦听器。由于侦听器只要求实现一个合适的接 口,所以实际上,可以在任何希望的地方接收和处理事件。在 Java 中使用侦听器对象处理 事件的方式,称为委托事件模型,这是因为对于诸如按钮这种组件引起的事件响应,并不 是由引起事件的对象本身处理,而是委托独立的侦听器对象进行处理,刚才的 actionPerformed()其实就是一个委托处理方法。现在让我们来看一下,JButton 是如何 将用户的点击转化成方法处理的(如图 1-2)。
其实可以使任何类的对象成为侦听器对象,只要使该类实现侦听器接口。你将会发现有各 种各样的侦听器接口,以满足不同类型事件的需要。在这个单击按钮的例子中,需要实现 ActionListener 接口以便接收按钮事件。在侦听器接口声明的方法中,实现了接受这个事 件对象并响应该事件的代码。在本例中,在事件发生时,调用了 ActionListener 接口中的 actionPerformed()方法。每种侦听器接口都定义了特定的方法,用来接收该侦听器计划 要处理的事件。
//侦听器对象 ButtonEventHandler(用来侦听按钮的点击操作) class ButtonEventHandler implements ActionListener { //窗体对象 private EventDemo form = null; //通过构造体传入窗体对象, //作用在于让侦听器对象明白事件源处于 //哪个窗体容器中 public ButtonEventHandler(EventDemo form) { this.form = form; } //委托方法 public void actionPerformed(ActionEvent e) { //该方法将会把事件的处理权交给窗体容器类的 //btnPress_Click 方法处理。 this.form.btnPress_Click(e); } }
4.When:集合框架顾名思义就是某些相关数据的整合个体,那么当我们需要将一些相同 特性的个体整合或者说绑定在一起的时候,就可以考虑使用集合框架了,因为集合框架可 以保存和帮定这样一些数据。
5.Who:所有的 Java,.Net 程序员都可以使用集合框架,因为现今的面向对象的高级编 程语言都提供了集合框架的处理类。
后通过 getName()方法得到这个按钮的名字。至此整个点击事件处理完了。
这篇文章主要的作用是为了阐述 Java 的事件处理机制, 至于侦听器和事件源的内部工作原 理,将会在我的下一篇技术文章《Java 的观察者模式》中详细讲解,待续……
上海 Softworks 软件人才培训中心 电话:021-53086530 53086531 地址:上海市北京东路 668 号科技京城东楼 9 楼 E 座 网址:
现在我们来看一个生活中的示例,如果有一天你走在路上一不小心被天上掉下来的花瓶砸 到了,并且晕死了过去。那么整个过程其实就是一个事件处理流程,而且我们可以非常方 便的分析出刚才所提到的事件驱动模型中的三大要素。
1.被砸晕的这个人其实就是事件源,因为他是能够接受到外部的事件的源体。
2.侦听器就是这个人的大脑神经,因为它会感知到疼痛。
事件驱动模型实例详解(Java 篇)2007-08-10 来自: [收藏到我的网摘]
或许每个软件从业者都有从学习控制台应用程序到学习可视化编程的转变过 程,控制台应用程序的优点在于可以方便的练习某个语言的语法和开发习惯(如.net 和 java),而可视化编程的学习又可以非常方便开发出各类人机对话界面(HMI)。可视化编 程或许是一个初学者开始对软件感兴趣的开始,也可能是一个软件学习的里程碑点,因为 我们可以使用各类软件集成开发环境(IDE)方便的在现成的界面窗口上拖放各类组件 (Component),这类组件包括我们常见的按钮(Button),单选按钮(Radio Button),复 选框等(Checkbox)。这样的拖放式开发方式不但方便,而且窗口会立竿见影的显示在我 们的面前,这对于一个软件初学者而言或许是一件非常有成就感的事情。
集合框架的授课感想 2007-08-10 来自: [收藏到我的网摘]
集合框架 (Collection) 可以说是软件编程中过程中极其重要的一个概念,为什 么我这里要用“极其”这个词呢?就是因为在我的 14 个项目研发经验中, 几乎每个项目都需 要使用集合框架,如果用好了集合框架,那么整个项目将会变得非常灵活,因此在我 Softworks 中心的培训经历中,我也非常注重对于这个概念的培训。其实比较喜欢在网上 浏览技术的同学可能知道,网上有比较流行的 32 道经典 Java 面试考题,在这些考题中就 有很多是用来考察学员对于集合框架的理解程度的。
图 1-2
JButton 组件初始化代码片断:
private void initialize() { frame = new JFrame(); frame.getContentPane ().setLayout (null); frame.setBounds (100, 100, 247, 165); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle ("事件驱动程序"); //btnPress 就是这次点击操作中的事件源 btnPress = new JButton(); btnPress.setText ("Press"); btnPress.setName ("Press"); btnPress.setBounds (63, 98, 99, 23); //向事件源 btnPress 植入侦听器对象 ButtonEventHandler
1.什么是事件驱动模型?
在讲解事件驱动模型之前,我们现在看看事件驱动模型的三大要素:
? 事件源:能够接收外部事件的源体。
? 侦听器:能够接收事件源通知的对象。
? 事件处理程序:用于处理事件的对象。
学员应该要理解任何基于事件驱动模型的开发技术都包含以上三大要素,不管是.net 还是 java 技术,甚至是以前我们使用的 Visual Basic 和 Delphi 语言都有基于以上三大要素的 事件驱动模型开发流程。
按钮的事件处理程序代码片断:
代码工作原理:
JButton 组件初始化代码片断已经明确阐述了按钮被创建后放置于窗体上,关键在于本代 码片断的以下语句:
btnPress.addActionListener(new ButtonEventHandler(this));
该语句就是向事件源植入了侦听器对象 ButtonEventHandler,该类实现了 ActionListener 结构, 因此 JButton 类的对象 btnPress 这个时候已经具有了处理用户点 击按钮的能力了。