下面我简要的总结一下:
鼠标事件提供了mousePressed,mouseClicked,mouseDragged,mouseEntered,mouseExited,
import
import
public
{int
int
}
//<applet
import
{
}
}
//
///
import
import
import
public
//实现ItemListener
{
public
}
//<Applet
*
JAVA的事件处理
**
低级事件:
**
高级事件:
***
◇
public
◇
public
****
AWT事件及相应的事件接口
MouseEvent
KeyEvent
FocusEvent
AdjustmentEvent
ComponentEvent
WindowEvent
ContainerEvent
TextEvent
*****
下面代码是一个关于使用鼠标适配器的例子:
import
import
public
public
{
}
java.awt.event包中定义的事件适配器类包括以下几个:
1.ComponentAdapter(
2.ContainerAdapter(
3.FocusAdapter(
4.KeyAdapter(
5.MouseAdapter(
6.MouseMotionAdapter(
7.WindowAdapter(
----------------------------------------------
得首先明白java中的事件机制的参与者
有3种角色:
1.eventobject:就是事件产生时具体的“事件”,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中
2.eventsource:具体的接受事件的实体,比如说,你点击一个button,那么button就是eventsource,这样你必须使button对某些事件进行相应,你就需要注册特定的listener,比如说MouseEvent之中的MouseClicked方法,这是他就必须有了add方法
3.event listener:具体的对监听的事件类,当有其对应的eventobject产生的时候,它就调用相应的方法,进行处理。在windows程序设计里边这种相应使用callback机制来实现的
---------------------------------------------
这样或许过于抽象, 举个例:
假如你是某娱乐报刊的记者, 要追踪报道某名星, 比如谭咏麟, 张学友,刘德华
在这里,event listener就是报刊的记者, event source就是谭咏麟,张学友, 刘德华他们,
是他们三个没错, 但总不能所有日常行为都报道吧,
所以得定义出什么要报道的, 比如开演唱会,比如他们中的某个和新生代某女走在一起了 等等,
这些就是event object.
假如你boss让你跟踪谭咏麟有没有开演唱会,张学友和刘德华有没有出新专辑和酒后驾车,
于是你这个event listener就在记事本上list下这些,也就是在谭咏麟这个.event source上add一个有没有开演唱会的方法,分别在张学友和刘德华上add一个有没有出新专辑和add一个有没有酒后驾车的方法,
你的追踪报道都是以list为依据的, 谭咏麟酒后驾车这件事发生了,但是你boss没有让你留意这个, 也就是在 谭咏麟这个eventsource上没有监听酒后驾车这事, 所以没有响应报道, 张学友出新专辑,你查看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");
}
});
newMouseAdapter()就是一个匿名内部类。其实就是在实现类的同时用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{//或implementsMouseListener
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");
}
}