根据项目的要求,必须为Java提供支持事件驱动机制的类库,以实现类似于C#事件和删除的机制。 众所周知,Java语言本身及其标准库没有事件驱动机制的接口。 Swing (我认为它不属于标准库。 )中存在用于为组件实现事件处理的相关类,但它毕竟与GUI绑定在一起,与其他类型的APP应用程序一起使用会产生不协调的感觉,而且缺乏通用性。 因此,必须实现常规Java事件驱动机制的类库,并将其应用于常规Java APP应用程序。 这并不难, )
首先,我们来考察一下C#的事件驱动机制的创建方法。 C#提供的event关键字可用于轻松定义事件。 然后,可以通过向事件添加事件处理程序来触发事件并调用关联的处理程序。 也就是说,它是一个事件驱动的过程。 例如:
//定义事件和对应的请求
public event MyDelegate Click;
公共删除我的电话删除(;
//定义委托
voidonclick(}
console.writeline (' youjustclickedme!' );
}
//将请求与事件关联
Click =OnClick;
//触发事件
单击(;
上面的代码是用C#实现的事件驱动机制的一个简单示例,您可以看到它非常简单。 这一切都来自于C#在语言级别(实际上是CLR )提供的便利。 很遗憾,Java没有提供这样的便利,需要人为实现。 本文提供了两种实现事件驱动机制的方法作为参考。
观察者模式
观察者模式是一种常用的设计模式,观察者(Observer )首先通过订阅被观察对象(Subject )来告知观察者(Observer )其变化
该设计模式正好可用于事件驱动机制,事件(event )相当于观察对象(Subject ),当事件被触发时,调用事件处理程序,事件处理程序(C#中的委托) 因此,上述功能可以通过以下方式实现。
/*事件类/
公共事件{
//事件相关的事件处理函数
公共数组缓存列表;
//事件触发函数
公共void emit () {
呼叫CB :呼叫列表(for )
cb.run (;
}
}
//注册事件处理函数
公共后台(callback CB ) {
callbacklist.add(CB;
}
}
/*事件处理程序函数类*
公共接口调用{
void run (;
}
publiconclickimplementscallback {
//函数
公共语音运行(}
system.out.println (' youjustclickedme!' );
}
/*实现事件驱动*
Event e=new Event (;
在事件中注册OnClick事件处理程序
e .注册查询(new onclick ) );
//触发事件
e.emit (;
上面的Java代码实现了简单的事件驱动机制,原理简单,是典型的观察者模式应用实例。
利用反射
Java语言提供了强大的反射功能,使您可以在运行时检索和操作类的各种组件,包括类名、类成员函数和类属性。 使用反射实现简单的事件驱动机制。
/*事件处理类*
公共类事件管理器{
//事件源
私有对象发送器;
//事件处理程序名称(用于反射) )。
私有字符串回调;
公共事件生成器(object sender,String callback ) {
this.sender=sender;
this.callback=callback;
}
//事件触发器
公共void emit () {
classendertype=this.sender.getclass (;
try {
//获取并调用事件源sender的事件处理函数
方法方法=
senderType.getMethod(this.callback);method.invoke(this.sender);
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
/*事件源*/
public class Button(){
/*可以在此设置Button类的相关属性,比如名字等*/
private String name;
...
//事件处理函数
public void onClick(){
System.out.println("you just clicked me!");
}
}
/*实现事件驱动机制*/
Button b = new Button();
if(/*收到按钮点击信号*/){
EventHandler e = new EventHandler(b,"onClick");
e.emit();
}
上述代码展示了利用反射实现的事件驱动机制,利用反射机制的好处是其具有强大的扩展性,比如我的事件处理函数中可以引入一个EventArgs的形参,从而可以让事件本身带有参数,这样就可以让事件携带更多的信息,改写后的事件处理函数如下方的代码所示:
public class EventArgs {
//参数
String p1;
Integer p2;
...
}
//onClick事件处理函数改写
public void onClick(Object sender,EventArgs e){
//参数e提供更多的信息
System.out.println("Hello,you clicked me! " + e.p1 + e.p2);
}
//触发函数emit改写
public void emit(EventArgs e){
Class senderType = this.sender.getClass();
try {
//获取并调用事件源sender的事件处理函数
Method method = senderType.getMethod(this.callback,this.getClass(),e.getClass());
method.invoke(this.sender,this.sender,e);
} catch (Exception e2) {
e2.printStackTrace();
}
}
是不是似曾相识?没错,和用C#写Winform窗体时,Visual studio为你自动生成的事件处理函数(代码中的onClick函数)几乎具有完全相同的形式,但此时我们是用Java实现的。
当然,除了以上提到的两种方法可以实现Java的事件驱动机制以外,还有一些其它的方法,比如可以利用Java的内部类来实现,笔者也曾写过一些示例代码,这里就不再冗言了,留待以后再讲。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结
以上是编程之家为你收集整理的浅谈用java实现事件驱动机制全部内容,希望文章能够帮你解决浅谈用java实现事件驱动机制所遇到的程序开发问题。
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250