反射在Java Swing事件处理中的应用

转载 2007年09月18日 21:14:00
      学习过Java Swing的读者一定对于Swing中相对较为复杂的事件驱动模型比较困惑,虽然事件驱动模型在Java Swing中被完完全全的体现出来了,但是对于一个软件初学者而言这样的近乎“裸体”的事件驱动模型确实是很难理解的。
      Microsoft公司.Net框架与Java Swing的GUI编程相比要简单很多,同样是事件驱动模型.Net框架就进行了大量的封装处理,.Net把这种封装称之为委托器(Delegate)其代码如下:

//当btnSubmit按钮被点击以后要求交给btnSubmit_Click方法处理
// EventHandler在中间启到委托器的作用,
//它负责将事件分发到指定的方法中进行处理
this.btnSubmit.Click += new EventHandler(this.btnSubmit_Click);
//事件处理方法
// object sender:事件源,这里指btnSubmit对象
// EventArgs e:事件处理参数,它保存了需要提供给程序员的必要信息
    private void btnSubmit_Click(object sender, EventArgs e)
    
...{
        
//打印This is a button语句
        System.Diagnostics.Debug.WriteLine("This is button");
}
 

作为对比,我们来看看Java Swing的事件处理和委托就要复杂很多:代码如下:(您若还不是很了解Swing事件驱动的话,可以参考我的另外一篇文章:事件驱动模型实例详解(Java篇)

//为btnSubmit增加侦听器SelectHandler,当btnSubmit被点击以后
//有侦听器的actionPerformed负责处理该点击事件的业务
//由于事件源btnSubmit和侦听器类SelectHandler处于两个不同的类中
//为了让SelectHandler类取得页面的信息,我们需要将窗体对象(this)
//传入到侦听器中
btnSubmit.addActionListener(new SelectHandler(this));
//侦听器SelectHandler,它必须实现动作事件ActionListener接口
//以达到事件分发的作用
class SelectHandler implements ActionListener ...{
    
private CommonDialogDemo form = null;
    
//将窗体对象CommonDialogDemo通过构造函数传入SelectHandler类中
    public SelectHandler(CommonDialogDemo form) ...{
        
this.form = form;
    }

    
//事件处理方法,当btnSubmit被点击,自动执行以下打印代码
    public void actionPerformed(ActionEvent e) ...{
        System.out.println(
"This is button");
    }

}

根据以上代码,我们可以清晰的看到Java Swing要比.Net的麻烦的多,而且更不能让人忍受的就是,一个页面如果有多个按钮的话,我们必须针对每个按钮编写多个事件侦听类,而且这些类一般都会被设为内部类。学过软件建模的读者可能知道,内部在软件建模在软件工程中是不推荐使用的,所以这样的代码编写明显会增加设计冗余度和复杂度,因此我们可以考虑自己编写一个类似于.Net中EventHandler一样的事件委托类来处理事件分发。
       由于我们无权修改Java的编译器,所以我在这里将会借助于反射技术,利用一个事件委托类处理所有的点击事件,代码如下:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Method;
 
/** *//**
 *该类是用来处理所有的Swing按钮点击事件,并根据将处理权<br>
 *转交给使用者来处理
 *
 *@authorChen.yu
 *
 
*/

public class EventHandler implements ActionListener 
...{
   
    
//组件所在的窗体对象
    private Object form = null;
   
    
//受到委托的方法名
    private String methodName = null;
   
    
/** *//**
     *构造函数
     *
     *@paramform           组件所在的窗体对象
     *@parammethodName     受到委托的方法名
     
*/

    
public EventHandler(Object form,String methodName) ...{
        
this.form = form;
        
this.methodName = methodName;
    }

   
    
/** *//**
     *事件处理委托方法
     
*/

    publicvoid actionPerformed(ActionEvent e) 
...{
       
        
//得到窗体对象的类型
        Class formType = this.form.getClass();
       
        
try ...{
            
//得到指定委托方法的类型
            Method method =
                formType.getMethod(
this.methodName, new Class[] ...{e.getClass()});
            
//调用指定的方法
            method.invoke(this.form, new Object[] ...{e});
           
        }
catch(Exception ex) ...{
            
return;
        }
      
   
    }

 
}


现在我们来编写一个测试程序,代码如下:

btnSearch.addActionListener(
new EventHandler(this,"btnSearch_Click"));
 
public void btnSearch_Click(ActionEvent e) ...{
    System.out.println(
"This is btnSearch");
}

从以上代码中我们可以清晰的看到,事件处理和事件委托处于同一窗体中了,.Net方便的Delegate处理被我们用反射实现了。
 


反射在框架开发中的应用

框架就是有很多牛人在我们还在上小学的时候(不懂程序的时候)给我们做了一套开发的架子,以后我们在应用开发时。就可以直接用这套架子,只需要把我们自己的一点东西加进来就可以了。就好比房子,开发商为我们提供了...
  • chen5287603
  • chen5287603
  • 2011年05月23日 01:10
  • 744

java反射在spring中的应用

java反射在spring中的应用
  • bawcwchen
  • bawcwchen
  • 2015年01月18日 22:01
  • 724

Java Swing 中三种事件处理方法的比较

Swing是目前Java中不可缺少的窗口工具组,是用户建立图形化用户界面(GUI)程序的强大工具。JavaSwing组件自动产生各种事件来响应用户行为。如当用户点击按钮或选择菜单项目时,Swing组件...
  • jearmy
  • jearmy
  • 2014年12月03日 21:30
  • 1332

反射在Java Swing中的应用

 学习过Java Swing的读者一定对于Swing中相对较为复杂的事件驱动模型比较困惑,虽然事件驱动模型在Java Swing中被完完全全的体现出来了,但是对于一个软件初学者而言这样的近乎“裸体”的...
  • frank_softworks
  • frank_softworks
  • 2007年08月25日 09:04
  • 6266

反射在Java Swing中的应用

 学习过Java Swing的读者一定对于Swing中相对较为复杂的事件驱动模型比较困惑,虽然事件驱动模型在Java Swing中被完完全全的体现出来了,但是对于一个软件初学者而言这样的近乎“裸体...
  • itkbase
  • itkbase
  • 2008年03月11日 15:14
  • 120

框架使用java反射好处

一个Java程序可能有很多类构成。当程序运行时,JVM会从类路径中将这些类装入内存并根据代码的指示实例化出对象。但这一过程对于程序员而言似乎是透明的,只要简单的 书写如下的代码: Foo foo = ...
  • woailuo453786790
  • woailuo453786790
  • 2015年10月28日 19:35
  • 844

Java反射机制的应用-模拟Spring的依赖注入

采用Java的反射机制,结合XML文档解析,模拟Spring中的setter方法依赖注入。
  • fullStackChenZF
  • fullStackChenZF
  • 2017年07月12日 08:17
  • 454

Java Swing 中三种事件处理方法之比较

一、什么是事件事件是用户与GUI(图形界面)交互的时候所触发的事情。 监听器是能够检测事件并且能够响应事件的代码。 创建一个监听器类,在GUI类内声明这个类的实例,并且把监听器对象和需要响应事件的GU...
  • DL88250
  • DL88250
  • 2007年02月18日 12:38
  • 2251

java反射的应用(Hibernate)

java反射的应用(Hibernate)          Hibernate是一个屏蔽了JDBC,实现了ORM的java框架,利用该框架我们可以抛弃掉繁琐的sql语句而是利用Hibernate中...
  • u013366812
  • u013366812
  • 2016年07月23日 16:28
  • 402

Java反射在Android中的应用,以及注意事项

Java反射在Android中的应用,以及注意事项 在【玩转SQLite系列】(七)打造轻量级ORM工具类SQLiteDbUtil操作数据库 这篇文章当中,我封装了一个轻量级的数据库ORM工...
  • u010785585
  • u010785585
  • 2016年11月30日 09:04
  • 1926
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:反射在Java Swing事件处理中的应用
举报原因:
原因补充:

(最多只允许输入30个字)