黑马程序员——事件处理机制

来源:互联网 发布:网站seo竞争分析工具 编辑:程序博客网 时间:2024/05/17 19:15

 任何带有图形界面的程序,都需要对图形界面中的组件进行事件处理,例如我们在使用Windows时,在桌面的空白处点击右键就会出现一个菜单,这就是一个事件处理机制。它的作用就是当有事件产生时,使应用程序做出相应的响应。

想要掌握事件处理的原理就要明白三个概念,它们分别是:

1、  事件源

能够产生事件的对象都可称为事件源,例如:我们点击一个按钮,那么这个按钮就是一个事件源,点击这个动作虽然是我们做得,但是事件却是由按钮来产生的。即我们可以这样来理解事件源:动作放生在谁身上,谁就是事件源。

2、  监视器

事件源身上产生了事件,系统如何对这个事件进行捕捉,这是就需要一个对象对事件源进行监视,以便对发生的事件进行处理。事件源通过调用相应的方法可以将某个监视器对象注册到自己身上,例如,对于文本框,这个方法是:

addActionListener(ActionListener  listener)

文本框获取监视器之后,向文本框中输入数据,然后按确认件,那么jvm会自动地用ActionEvent类创建一个对象,即发生了ActionEvent事件,然后监视器会监视到此事件,针对与此事件监视器会调用自己相应的方法来处理。

3、  处理事件的接口

我们要向事件源身上注册一个监视器对象,那么监视器对象又是从何而来的,如上诉代码:

addActionListener(ActionListener  listener)

我们应该如何定义一个listener对象,listener 对象为一个实现ActionLisener接口类的对象,那么我们就必须创建一个实现ActionListener接口的类,然后将此对象创建的对象传递给此方法,使得该对象称为事件源的监视器。那么我们要如何创建一个实现ActionListener接口的类呢?这个类要实现那些方法呢?我们先看一下ActionListener接口的代码:

 

public  interface  ActionListener  extends  EventListener

             {

                   public  void  actionPerformed(ActionEvent  e);

}

由代码我们可知,要创建实现这个接口的类,我们只要覆盖其 

Public  void  actionPerformed(ActionEvent  e);

方法即可,此方法中是提供是由我们实现的处理事件的操作,jvm中采用的是接口回调技术来处理事件,当事件源发生事件,接口立刻通知监视器自动调用实现的某个接口中的方法,此方法中封装的为处理事件的操作,接口回调这一过程对于程序来说是不可见的,java在设计组件事件时已经设置好这一回调过程,因此在事件处理机制中,我们所能做得就是,让事件源获取正确的监视器,监视器中封装了正确的事件处理操作。

4、  ActionEvent

当我们在事件源上发生动作,事件源即会产生相应的事件对象,然后将相应的事件对象传递给监视器,我们就可在监视器中调用此事件对象的一些方法,来获取一些我们所需要的信息。那么ActionEvent都有哪些方法可以供我们使用呢?

public String getActionCommand()

返回与此事件相关的命令字符串。这使得 "modal" 组件可以由其当前的状态,通过此字符串来得到它能够产生的几个命令之一。例如,单个按钮可以在显示详细信息隐藏详细信息之间切换。在所有情况下,源对象和事件都将是相同的,但命令字符串将会标识出实际对应的动作。

注意,如果将 null 命令字符串传递给此 ActionEvent 的构造方法,则此方法返回 null

 

public long getWhen()

返回发生此事件时的时间戳。因为ActionEvent 是一个高级别语义事件,所以时间戳通常与基础InputEvent 相同。

 

public String paramString()

返回标识此动作事件的参数字符串。此方法对于事件记录和调试很有用。

      

实现监视器类

实现监视对象的方式有三种,它们分别为:

1、  以单独的一个类实现

如果在多个类中,使用到了同样个监视器,那么我们可以将此监视器类定义为一个外部类,然后再不同的类中,创建此监视器的对象即可,即针对于不同的事件源(此事件源在不同的类中)的同一动作,如果处理方式相同的话,我们可以将此监视器类定义为一个外部类,在不同事件源所在的类中创建此外部类的对象,并将此对象注册到不同类中的事件源身上即可。

2、  以内部类来实现

如果在一个类中有多个事件源,而这多个事件源对于同一个事件,所做成的反映是相同的,那么我们可以将此监视器类定义为一个内部类,然后在此类中创建此内部类的对象,在将此对象注册到不同的事件源上即可。

3、  以匿名内部类对象来实现

如果一个事件源上产生事件,而针对于此事件有其独特的处理方式,那么我们可以将此监视器以匿名内部类对象来实现,即在调用添加监视器方法时候,向其传递一个匿名内部类对象。

适配器

       要创建一个监视器类,就要实现一个侦听器接口,而此接口中有可能包含多个方法,那么我们在实现这个接口的类中,必须实现这个接口的全部方法,这是一件相当麻烦的事情,因此java为我们提供了一个新的类,适配器类:在java提供的接口中,如果其中的方法多余一个,那么就提供一个相关的称为适配器的类。这个适配器是已经实现了相应接口的类。因此我们在实现某个接口时,就可以继承此接口的适配器类,并覆写我们所需要的方法即可。

       适配器类在我们创建监视器类时极为有效,例如:我们想创建一个实现WindowListener接口的监视器类,如果按照平常的方式,我们要实现此接口中的全部方法,但是有了适配器类,我们只需要继承与WindowListener相关的适配器类WindowAdapte并实现我们需要的方法即可。

 

 

原创粉丝点击