学习过Java Swing的读者一定对于Swing中相对较为复杂的事件驱动模型比较困惑,虽然事件驱动模型在Java Swing中被完完全全的体现出来了,
但是对于一个软件初学者而言这样的近乎“裸体”的事件驱动模型确实是很难理解的。
Microsoft公司.Net框架与Java Swing的GUI编程相比要简单很多,同样是事件驱动模型.Net框架就进行了大量的封装处理,.Net把这种封装称之
为委托器(Delegate)其代码如下:
1 //当btnSubmit按钮被点击以后要求交给btnSubmit_Click方法处理
2 // EventHandler在中间启到委托器的作用,
3 //它负责将事件分发到指定的方法中进行处理
4 this.btnSubmit.Click += new EventHandler(this.btnSubmit_Click);
5 //事件处理方法
6 // object sender:事件源,这里指btnSubmit对象
7 // EventArgs e:事件处理参数,它保存了需要提供给程序员的必要信息
8 private void btnSubmit_Click(object sender, EventArgs e)
9 {
10 //打印This is a button语句
11 System.Diagnostics.Debug.WriteLine("This is button");
12 }
13
作为对比,我们来看看Java Swing的事件处理和委托就要复杂很多:代码如下
1 //为btnSubmit增加侦听器SelectHandler,当btnSubmit被点击以后
2 //有侦听器的actionPerformed负责处理该点击事件的业务
3 //由于事件源btnSubmit和侦听器类SelectHandler处于两个不同的类中
4 //为了让SelectHandler类取得页面的信息,我们需要将窗体对象(this)
5 //传入到侦听器中
6 btnSubmit.addActionListener(new SelectHandler(this));
7 //侦听器SelectHandler,它必须实现动作事件ActionListener接口
8 //以达到事件分发的作用
9 class SelectHandler implements ActionListener {
10 private CommonDialogDemo form = null;
11 //将窗体对象CommonDialogDemo通过构造函数传入SelectHandler类中
12 public SelectHandler(CommonDialogDemo form) {
13 this.form = form;
14 }
15 //事件处理方法,当btnSubmit被点击,自动执行以下打印代码
16 publicvoid actionPerformed(ActionEvent e) {
17 System.out.println("This is button");
18 }
19 }
20
根据以上代码,我们可以清晰的看到Java Swing要比.Net的麻烦的多,而且更不能让人忍受的就是,一个页面如果有多个按钮的话,我们必须针
对每个按钮编写多个事件侦听类,而且这些类一般都会被设为内部类。学过软件建模的读者可能知道,内部在软件建模在软件工程中是不推荐使
用的,所以这样的代码编写明显会增加设计冗余度和复杂度,因此我们可以考虑自己编写一个类似于.Net中EventHandler一样的事件委托类来处
理事件分发。
由于我们无权修改Java的编译器,所以我在这里将会借助于
反射技术,利用一个事件委托类处理所有的点击事件,代码如下:
1 package cn.softworks.teachersearchsystem.support;
2
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5 import java.lang.reflect.Method;
6
7 /**
8 *该类是用来处理所有的Swing按钮点击事件,并根据将处理权<br>
9 *转交给使用者来处理
10 *
11 *@authorChen.yu
12 *
13 */
14 public class EventHandler implements ActionListener {
15
16 //组件所在的窗体对象
17 private Object form = null;
18
19 //受到委托的方法名
20 private String methodName = null;
21
22 /**
23 *构造函数
24 *
25 *@paramform 组件所在的窗体对象
26 *@parammethodName 受到委托的方法名
27 */
28 public EventHandler(Object form,String methodName) {
29 this.form = form;
30 this.methodName = methodName;
31 }
32
33 /**
34 *事件处理委托方法
35 */
36 publicvoid actionPerformed(ActionEvent e) {
37
38 //得到窗体对象的类型
39 Class formType = this.form.getClass();
40
41 try {
42 //得到指定委托方法的类型
43 Method method =
44 formType.getMethod(this.methodName, new Class[] {e.getClass()});
45 //调用指定的方法
46 method.invoke(this.form, new Object[] {e});
47
48 }catch(Exception ex) {
49
50 return;
51 }
52
53 }
54
55 }
56
57
现在我们来编写一个测试程序,代码如下:
1 btnSearch.addActionListener(
2 new EventHandler(this,"btnSearch_Click"));
3
4 public void btnSearch_Click(ActionEvent e) {
5 System.out.println("This is btnSearch");
6 }
7
从以上代码中我们可以清晰的看到,事件处理和事件委托处于同一窗体中了,.Net方便的Delegate处理被我们用反射实现了。
分享到:
相关推荐
**在Java中实现事件委托**:虽然Java的标准库并不直接支持事件委托,但可以通过自定义事件和发布/订阅模型来实现类似的功能。例如,可以创建一个事件类,包含事件类型和数据,并使用发布者(Publisher)和订阅者...
- **事件处理的演变**:Java的事件处理经历了从JDK1.0的包容模型到JDK1.1的委托模型的转变。在委托模型中,事件源生成事件,然后通过事件监听器将事件委托给处理代码。后续版本如JDK1.2引入Swing,提供了更强大的...
7. **事件委托**:事件处理还可以采用事件委托的方式,即将一个组件的事件处理委托给另一个组件或类。这种方式可以使代码结构更清晰,提高代码复用性。 8. **事件层次**:在复杂的GUI中,事件可能会涉及到组件层次...
2、根据事件传播模型,如果发生异常断言则停止事件传播。 3、能够对组件串行执行的先后顺序进行编排。 4、有共性的处理机制可以进行封装,执行过程中视其为透明。 5、通过隐藏一些实现细节,使每一个关注点看起来都...
Java的事件处理机制采用委托事件模型,这一模型的工作流程如下: 1. 用户与GUI组件(事件源)交互,触发事件。 2. 事件源通过调用注册方法将监听器对象添加到自己的监听器列表中,从而将事件处理权委托给监听器。 3...
4. **事件队列(Event Queue)**:Java使用单线程模型处理事件,所有的事件都会被添加到事件队列中,然后由事件调度线程按照先进先出(FIFO)的原则处理。 5. **注册监听器(Registering Listeners)**:为了使监听...
- **语法差异**:Java使用接口和实现的方式进行事件处理,而.NET则使用委托和事件关键字简化了这一过程。 - **灵活性**:两者都提供了灵活的方式来处理事件,但.NET通过LINQ等特性提供了额外的功能支持。 - **性能...
总的来说,Java GUI事件处理机制通过委托事件模型,实现了组件与用户交互的响应,使得开发者可以灵活地构建交互性强的图形用户界面。理解和掌握这一机制,对于编写高效、易维护的Java GUI应用程序至关重要。
Java Swing采用事件委托模型,这意味着组件会将事件传递给它们的事件源。例如,按钮的点击事件会被传递给注册在其上的监听器。这样,我们可以为同一类型的事件设置多个监听器,实现更复杂的逻辑。 6. 编程示例: ...
Swing则引入了更灵活的事件适配器(EventAdapter)和事件委托模型。 - **事件适配器(Event Adapter)**:为简化事件监听器的编写,Java提供了各种适配器类,如ActionAdapter,它们实现了监听器接口的所有方法,但...
本文将围绕“Java GUI编程中的事件处理机制详细讲解(1)”这一主题展开,深入探讨组件类事件、动作类事件以及事件委托授权处理模型等内容,并结合实际案例进行说明。 #### 组件类事件与动作类事件 Java GUI编程中...
在Java编程环境中,有时我们需要对用户的输入...在处理事件时,理解Java的事件模型以及如何有效地使用事件监听器是至关重要的。通过熟练掌握这些技能,开发者可以更好地控制应用程序的交互行为,实现特定的功能需求。
图像用户界面程序设计;鼠标委托时间处理模型.
在C#中,COM事件通过接口和委托实现,而在C++或JAVA中,可以通过实现特定接口来订阅和处理这些事件。本篇文章将详细探讨如何在C#中定义COM事件,并在C++和JAVA中触发和响应这些事件。 首先,让我们理解C#中的COM...
"java与事件前戏"这个标题可能是在探讨Java中的事件模型和事件处理机制。在这个话题中,我们将深入理解Java AWT(Abstract Window Toolkit)和Swing库中的事件处理概念。 1. **事件源(Event Source)**: 在Java...
Spring框架是Java开发中广泛应用的一个开源框架,它提供了一种事件驱动模型来增强应用程序的组件之间的通信。在本文中,我们将深入探讨Spring事件驱动模型,理解其工作原理,并通过源码分析来深化认识。 首先,...
总的来说,用Java实现工作流涉及到多个方面,包括理解业务需求、选择合适的工作流引擎、设计和实现流程模型、处理服务集成、权限控制以及监控与调试。熟练掌握这些知识点,能帮助开发者构建出高效、稳定的工作流系统...
对于工具来说,有一些框架和库如Java的EventListener、JavaScript的EventEmitter或C#的委托和事件,可以帮助简化事件驱动编程的过程。 总结一下,事件驱动模型是一种基于异步消息传递的设计模式,它使系统能够灵活...
8. **事件委托(Event Delegation)**:在Swing中,事件委托模型允许组件将事件转发给父组件处理,这样可以减少代码重复,提高代码复用性。 9. **事件处理方法(Event Handling Methods)**:事件监听器接口定义了...
在JDK 1.1之前,Java使用的是层次事件模型(Hierarchy Model),但随后被委托事件模型取代,因为后者更有效率,结构也更清晰。在委托事件模型中,只有注册过的监听器才会收到事件通知,这样可以避免不必要的处理,...