反射在JavaSwing编程中的应用

反射在JavaSwing编程中的应用,第1张

反射在JavaSwing编程中的应用,第2张

学过Java Swing的读者一定对Swing中相对复杂的事件驱动模型感到困惑。虽然Java Swing中充分体现了事件驱动的模型,但是对于一个软件初学者来说,要理解这样一个近乎“*”的事件驱动模型确实很难。

微软的。Net框架比Java Swing的GUI编程简单多了。同样的事件驱动模型。Net框架,进行大量的封装处理。Net调用这个封装委托,其代码如下:

//点击btnSubmit按钮时,需要交给btnSubmit_Click方法处理。
/EventHandler在中间扮演委托者的角色,
/它负责将事件分发到指定的方法进行处理。
This . BTN submit . click+= new eventhandler(This . BTN submit
//事件处理方法
//对象发送方:事件源,这里指的是BTNSUBIT对象
/eventargse:事件处理参数,其中保存了要提供给程序员的必要信息
Private void BTN subit _ click(object sender,Evengese)
{
/print这是一个按钮语句
系统。diagnostics.debug.writeline("这是一个按钮");
}

相比之下,我们再来看看Java Swing的事件处理和委托,就复杂多了:代码如下:(如果不太了解Swing事件驱动,可以参考我的另一篇文章:事件驱动模型实例详解(Java)):

//为btnSubmit添加监听器SelectHandler,当BTNSUBIT被点击时
//action performed with listeners负责处理click事件
//由于事件源BTNSUBIT和监听器类SelectHandler在两个不同的类中
//为了让SelectHandler类获得页面的信息,我们需要将form对象(this)
/传入监听器
btnSubmit . addactionlistener(new select handler(this));
// Listener SelectHandler,必须实现动作事件ActionListener接口
/才能实现事件分发的功能
类SelectHandler实现ActionListener {
私有公共对话框演示Form = null
//通过构造函数
Public SelectHandler(CommonDialogDemo Form){
this . Form = Form,将表单对象Common Dialog Demo传入select handler类;
}
/事件处理方法,当点击btnSubmit时,会自动执行下面的打印代码
public void action performed(action Event E){
system . out . println(" this is button ");
}
}

根据上面的代码,我们可以清楚地看到,Java Swing比。Net,而更让人难以忍受的是,如果一个页面有多个按钮,我们必须为每个按钮编写多个事件监听类,而这些类一般都被设置为内部类。学过软件建模的读者可能知道,软件工程中不推荐内部软件建模,这样的代码编写显然会增加设计冗余和复杂性。因此,我们可以考虑编写一个类似于。Net来处理事件分发。

由于我们无权修改Java的编译器,所以我将借助反射技术,使用一个事件委托类来处理所有的点击事件。代码如下:

包cn . soft works . teachers earchsystem . support;

导入Java . awt . event . action event;
导入Java . awt . event . action listener;
导入Java . lang . reflect . method;

/**
*该类用于处理所有的Swing按钮点击事件,并根据将处理权限转移给用户
* @ authorchen . Yu
*
*/

//组件所在的表单对象
私有对象form = null

//委托方法名
私有字符串方法名= null

/**
*构造函数
*
*@parammethodName委托方法的名称
*/
public eventhandler(对象形式,字符串方法名称){[/
this . Method Name = Method Name;
}

/**
*事件处理委托方法
*/
已执行公共void操作(ActionEvent E) {

//获取表单对象的类型
class formtype = this . form . getclass();

Try {
//获取指定委托方法的类型
method method =
formtype . Get method(this . method name,new class[]{ e . getclass()});
//调用指定的方法
method.invoke (this.form,new object[]{ e });

} catch(Exception ex){
return;
}
}
}

现在让我们用下面的代码编写一个测试程序:

BTN search . addactionlistener(new EventHandler(this,“BTN search _ Click”));

public void BTN search _ Click(ActionEvent e){
system . out . println(" This is BTN search ");
}

从上面的代码中,我们可以清楚地看到,事件处理和事件委托的形式是一样的,方便的委托处理。Net是通过反射实现的。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 反射在JavaSwing编程中的应用

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情