javaswing编程:反射在Java Swing编程中的应用

学习过Java Swing读者定对于Swing中相对较为复杂事件驱动模型比较困惑虽然事件驱动模型在Java Swing中被完完全全体现出来了但是对于个软件Software初学者而言这样近乎“裸体”事件驱动模型确实是很难理解

  Microsoft公司.Net框架和Java SwingGUI编程相比要简单很多同样是事件驱动模型.Net框架就进行了大量封装处理.Net把这种封装称的为委托器(Delegate)其代码如下:

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

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

//为btnSubmit增加侦听器SelectHandler当btnSubmit被点击以后
//有侦听器actionPerformed负责处理该点击事件业务
//由于事件源btnSubmit和侦听器类SelectHandler处于两个区别类中
//为了让SelectHandler类取得页面信息我们需要将窗体对象(this)
//传入到侦听器中
btnSubmit.addActionListener( SelectHandler(this));
//侦听器SelectHandler它必须实现动作事件ActionListener接口
//以达到事件分发作用
SelectHandler implements ActionListener {
 private CommonDialogDemo form = null;
 //将窗体对象CommonDialogDemo通过构造传入SelectHandler类中
 public SelectHandler(CommonDialogDemo form) {
  this.form = form;
 }
 //事件处理思路方法当btnSubmit被点击自动执行以下打印代码
 publicvoid actionPerformed(ActionEvent e) {
  .out.prln("This is button");
 }
}

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

  由于我们无权修改Java编译器所以我在这里将会借助于反射技术利用个事件委托类处理所有点击事件代码如下:

package cn.softworks.teachersearchsystem.support;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Method;

/**
*该类是用来处理所有Swing按钮点击事件并根据将处理权<br>
*转交给使用者来处理
*
*@authorChen.yu
*
*/
public EventHandlerimplements 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, Class {e.getClass});
   //指定思路方法
   method.invoke(this.form, Object {e});

  }catch(Exception ex) {
   ;
  }
 }


  现在我们来编写个测试代码如下:

btnSearch.addActionListener( EventHandler(this,"btnSearch_Click"));

public void btnSearch_Click(ActionEvent e) {
 .out.prln("This is btnSearch");
}

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

Tags:  javaswing swing编程实例 swing编程 javaswing编程

延伸阅读

最新评论

发表评论