java中的事件处理

java中的事件处理

转自: http://blog.sina.com.cn/s/blog_515624b60100a13r.html
 

得首先明白java中的事件机制的参与者

有3种角色:

1.event object:就是事件产生时具体的“事件”,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中

2.event source:具体的接受事件的实体,比如说,你点击一个button,那么button就是event source,这样你必须使button对某些事件进行相应,你就需要注册特定的listener,比如说MouseEvent之中的MouseClicked方法,这是他就必须有了add方法

3.event listener:具体的对监听的事件类,当有其对应的event object产生的时候,它就调用相应的方法,进行处理。在windows程序设计里边这种相应使用callback机制来实现的
---------------------------------------------
这样或许过于抽象, 举个例:
假如你是某娱乐报刊的记者, 要追踪报道某名星, 比如谭咏麟, 张学友, 刘德华
在这里,event listener就是报刊的记者, event source就是谭咏麟, 张学友, 刘德华他们,
是他们三个没错, 但总不能所有日常行为都报道吧,
所以得定义出什么要报道的, 比如开演唱会, 比如他们中的某个和新生代某女走在一起了 等等,
这些就是event object.

假如你boss让你跟踪谭咏麟有没有开演唱会, 张学友和刘德华有没有出新专辑和酒后驾车,
于是你这个event listener就在记事本上list下这些, 也就是在谭咏麟这个.event source上add一个有没有开演唱会的方法, 分别在张学友和刘德华上add一个有没有出新专辑和add一个有没有酒后驾车的方法,

你的追踪报道都是以list为依据的, 谭咏麟酒后驾车这件事发生了, 但是你boss没有让你留意这个, 也就是在 谭咏麟这个event source上没有监听酒后驾车这事, 所以没有响应报道, 张学友出新专辑, 你查看list, 原来有这行, 哗哗声来个快讯报道出来.
-------------------------------------------------------------
原理大概就是上面这个. 更加专业的解释就是

-------------------------------
Java做的图形界面软件通过事件响应机制实现用户与程序的交互,原理大概是这样:
首先,在java控件对象(比如文本框)上添加一个监控对象,方法是one.addXXXListenner(two),这就相当于你要对某人进行监听,先要在他身上绑定一个窃听器一样,这里“one”就是你要监听的那个家伙,two就是你自己造的一个窃听器。
第二步就是要考虑怎样造这个窃听器了,我们首先要搞清楚它要实现的功能:它不仅能够监听one的一举一动,还能够把监听到的事件告诉系统,并让系统对这个事件做出相应的处理。Java中是通过接口实现这样的功能的。这些接口请参见jdk中java.awt.event包,里面那几个XXXListener就是(不是很多,常用的更少)。在这些接口中定义了一些方法,这些方法就是相应的事件处理方式,它们只由系统调用并且都有一个事件类的对象作为参数,这个参数正是联系发生事件主体one和操作系统的纽带。当然接口是虚的,不能产生对象的;所以想必你也猜到,上面的“窃听器”two的类型肯定是某个实现了XXXListener接口的类。
好了,现在在回顾一下这个过程:
(1)用户通过鼠标、键盘等在one对象上做动作(比如点击鼠标),
(2)这个动作被two监听到并产生事件对象e(即XXXEvent的对象),
(3)two通过事件e对象向系统打报告,
(4)系统调用two中实现的方法对事件进行处理,并向方法传送事件e。
如果你清楚了这个过程,再来细看一下这个XXXListener接口。我们必须用类来实现接口的方法(这是java基础知识吧◎),再用这个类产生two这样的对象。类实现接口必须实现接口中的每个方法,而实际上我们需要的也许只是该接口中的某一个方法(比如处理鼠标右键点击的那个),那么每个方法还得去实现一个空的,真是浪费。Sun为了让程序员省点事,在JDK中已经为我们把这些接口实现好了,这些类就是我们所谓的“适配器”(XXXAdapter),我们只需要继承(extends)这些类并重写里面我们需要的方法就OK了,所以,其实适配器就是类,只不过这些类中只有一些空的方法,别无所有。
到此,你大概明白程序员在事件处理过程中该做哪些事了吧:
(1)制造“窃听器”,即:实现事件监听接口,重写相关方法,
(2)安装窃听器,即:为监控对象添加监听器。

下面,我们通过程序再来仔细看看事件响应的实现方式(待续):
(以下内容参考陈刚《eclipse从入门到精通》)
(1)、 匿名内部类写法
例程:
text.addMouseListener(new MouseAdapter() {
public void mouseDoubleClick(MouseEvent e) {//鼠标双击事件的方法
//打开一个信息框
MessageDialog.openInformation (null,"","Hello World");
}
});
new MouseAdapter()就是一个匿名内部类。其实就是在实现类的同时用new构造一个该类的对象,并把它作为addMouseListener的参数,它的效果和下面的一样,只不过代码比较集中。

(2)、命名内部类写法
public class HelloWorld {
public static void main(String[] args) {
……
Text text = new Text(shell, SWT.BORDER);
//加入鼠标事件监听器,并用下面代码所定义的内部类生成一个对象
text.addMouseListener(new MyMouseDoubleClick());
……
}

//定义一个名为MyMouseDoubleClick的内部类
private static final class MyMouseDoubleClick extends MouseAdapter {
public void mouseDoubleClick(MouseEvent e) {
MessageDialog.openInformation(null, "", "Hello World");
}
}
}

(3)、外部类写法
这种写法和命名内部类有些相似,只不过是将MyMouseDoubleClick类从HelloWorld.java中拿出去,单独写成一个类文件。实现代码如下
//文件1: HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
……
Text text = new Text(shell, SWT.BORDER);
//加入鼠标事件监听器,并用下面代码所定义的内部类生成一个对象
text.addMouseListener(new MyMouseDoubleClick());
……
}
}

//文件2:MyMouseDoubleClick.java
public class MyMouseDoubleClick extends MouseAdapter {
public void mouseDoubleClick(MouseEvent e) {
MessageDialog.openInformation(null, "", "Hello World");
}
}
(4)、实现监听接口的写法
将HelloWorld类实现MouseListener接口,这样类本身就成了一个监听器,使得加入监听器的代码可以更简洁。这种方式适合加入监听器的组件较多,且要求监听器的事件处理代码可以被组件共用。这种方式还有一个要注意的地方:事件方法和其他方法混合在了一起,容易引起误读,所以应该在事件方法前加入详细的注释说明。
实现MouseListener接口要写的事件方法多一些,当然没用的事件方法可以空实现。如果继承MouseListener接口的适配器MouseAdapter,则只写需要的方法就行了。另外要注意:只有接口才能有多继承的特性,所以如果HelloWorld已经是某个类的子类,就只能用实现接口的方式,而不能继承接口的适配器了。
给出示例代码如下:
public class HelloWorld extends MouseAdapter{//或implements MouseListener
public static void main(String[] args) {
……
Text text1 = new Text(shell, SWT.BORDER);
Text text2 = new Text(shell, SWT.BORDER);
text1.addMouseListener(this);
text2.addMouseListener(this);
……
}

public void mouseDoubleClick(MouseEvent e) {
MessageDialog.openInformation(null, "", "Hello World");
}

}


你可能感兴趣的:(java中的事件处理)