posts - 51, comments - 17, trackbacks - 0, articles - 9
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

java 事件机制续

Posted on 2007-04-13 09:37 chenweicai 阅读(350) 评论(0)  编辑  收藏

java中的事件机制

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");

    }

}


只有注册用户登录后才能发表评论。


网站导航: