`
wing123
  • 浏览: 799872 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

仿net事件委托的java事件模型实现

阅读更多
学习过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处理被我们用反射实现了。

分享到:
评论

相关推荐

    观察者模式Vs事件委托Demo

    **在Java中实现事件委托**:虽然Java的标准库并不直接支持事件委托,但可以通过自定义事件和发布/订阅模型来实现类似的功能。例如,可以创建一个事件类,包含事件类型和数据,并使用发布者(Publisher)和订阅者...

    用Java事件处理机制实现录制回放功能

    - **事件处理的演变**:Java的事件处理经历了从JDK1.0的包容模型到JDK1.1的委托模型的转变。在委托模型中,事件源生成事件,然后通过事件监听器将事件委托给处理代码。后续版本如JDK1.2引入Swing,提供了更强大的...

    关于JAVA中事件分发和监听机制实现的代码实例

    7. **事件委托**:事件处理还可以采用事件委托的方式,即将一个组件的事件处理委托给另一个组件或类。这种方式可以使代码结构更清晰,提高代码复用性。 8. **事件层次**:在复杂的GUI中,事件可能会涉及到组件层次...

    EventBus最佳实践:Java手撕实现ESB底层事件委托处理机制的思路,配套演示代码

    2、根据事件传播模型,如果发生异常断言则停止事件传播。 3、能够对组件串行执行的先后顺序进行编排。 4、有共性的处理机制可以进行封装,执行过程中视其为透明。 5、通过隐藏一些实现细节,使每一个关注点看起来都...

    java事件处理机制ppt

    Java的事件处理机制采用委托事件模型,这一模型的工作流程如下: 1. 用户与GUI组件(事件源)交互,触发事件。 2. 事件源通过调用注册方法将监听器对象添加到自己的监听器列表中,从而将事件处理权委托给监听器。 3...

    JAVA事件处理指南

    4. **事件队列(Event Queue)**:Java使用单线程模型处理事件,所有的事件都会被添加到事件队列中,然后由事件调度线程按照先进先出(FIFO)的原则处理。 5. **注册监听器(Registering Listeners)**:为了使监听...

    Java和_Net事件处理机制的比较研究

    - **语法差异**:Java使用接口和实现的方式进行事件处理,而.NET则使用委托和事件关键字简化了这一过程。 - **灵活性**:两者都提供了灵活的方式来处理事件,但.NET通过LINQ等特性提供了额外的功能支持。 - **性能...

    JavaGUI事件处理机制

    总的来说,Java GUI事件处理机制通过委托事件模型,实现了组件与用户交互的响应,使得开发者可以灵活地构建交互性强的图形用户界面。理解和掌握这一机制,对于编写高效、易维护的Java GUI应用程序至关重要。

    简单的java窗体及事件程序

    Java Swing采用事件委托模型,这意味着组件会将事件传递给它们的事件源。例如,按钮的点击事件会被传递给注册在其上的监听器。这样,我们可以为同一类型的事件设置多个监听器,实现更复杂的逻辑。 6. 编程示例: ...

    Java事件驱动程序设计相关代码

    Swing则引入了更灵活的事件适配器(EventAdapter)和事件委托模型。 - **事件适配器(Event Adapter)**:为简化事件监听器的编写,Java提供了各种适配器类,如ActionAdapter,它们实现了监听器接口的所有方法,但...

    Java GUI编程中的事件处理机制详细讲解 (1)

    本文将围绕“Java GUI编程中的事件处理机制详细讲解(1)”这一主题展开,深入探讨组件类事件、动作类事件以及事件委托授权处理模型等内容,并结合实际案例进行说明。 #### 组件类事件与动作类事件 Java GUI编程中...

    java屏蔽鼠标右键和键盘相关事件

    在Java编程环境中,有时我们需要对用户的输入...在处理事件时,理解Java的事件模型以及如何有效地使用事件监听器是至关重要的。通过熟练掌握这些技能,开发者可以更好地控制应用程序的交互行为,实现特定的功能需求。

    鼠标事件处理java程序设计

    图像用户界面程序设计;鼠标委托时间处理模型.

    C#的COM事件在C++和JAVA中触发和响应的实现

    在C#中,COM事件通过接口和委托实现,而在C++或JAVA中,可以通过实现特定接口来订阅和处理这些事件。本篇文章将详细探讨如何在C#中定义COM事件,并在C++和JAVA中触发和响应这些事件。 首先,让我们理解C#中的COM...

    java与事件前戏

    "java与事件前戏"这个标题可能是在探讨Java中的事件模型和事件处理机制。在这个话题中,我们将深入理解Java AWT(Abstract Window Toolkit)和Swing库中的事件处理概念。 1. **事件源(Event Source)**: 在Java...

    详解Spring事件驱动模型

    Spring框架是Java开发中广泛应用的一个开源框架,它提供了一种事件驱动模型来增强应用程序的组件之间的通信。在本文中,我们将深入探讨Spring事件驱动模型,理解其工作原理,并通过源码分析来深化认识。 首先,...

    用JAVA实现的工作流

    总的来说,用Java实现工作流涉及到多个方面,包括理解业务需求、选择合适的工作流引擎、设计和实现流程模型、处理服务集成、权限控制以及监控与调试。熟练掌握这些知识点,能帮助开发者构建出高效、稳定的工作流系统...

    事件驱动模型

    对于工具来说,有一些框架和库如Java的EventListener、JavaScript的EventEmitter或C#的委托和事件,可以帮助简化事件驱动编程的过程。 总结一下,事件驱动模型是一种基于异步消息传递的设计模式,它使系统能够灵活...

    java事件传递经典教程.rar

    8. **事件委托(Event Delegation)**:在Swing中,事件委托模型允许组件将事件转发给父组件处理,这样可以减少代码重复,提高代码复用性。 9. **事件处理方法(Event Handling Methods)**:事件监听器接口定义了...

    JAVA事件(台湾).pdf

    在JDK 1.1之前,Java使用的是层次事件模型(Hierarchy Model),但随后被委托事件模型取代,因为后者更有效率,结构也更清晰。在委托事件模型中,只有注册过的监听器才会收到事件通知,这样可以避免不必要的处理,...

Global site tag (gtag.js) - Google Analytics