事件、侦听器和适配器类

当活动发生(例如,按下按钮或关闭窗口)时,就会发信号通知 JavaBeans 事件。Visual Editor for Java 在 Java Bean 视图中显示事件,并且,可以使用此视图来添加和除去事件。

JavaBean 的已定义事件列表在其 BeanInfo 类中描述,该类还控制常用或首选事件。

如果想要在生成 JavaBean 时发生某些事件(例如,在按下按钮时更新数据库),则您可能会将事件添加至 JavaBean。产生事件的 Java Bean 是源,而产生事件时获取回调的对象则称为侦听器。每个 JavaBean 都具有一个接口,该接口允许 JavaBean 针对每个事件通知侦听器,并允许使用方法添加和除去侦听器。

通常,如果源 JavaBean 具有方法 XXX,则存在一个侦听器接口 XXXListener 和两个方法。XXXListener 继承 java.util.EventListener 是很重要的。如果不是这样,则除非提供特定的 BeanInfo,否则不会发现事件。

有关 XXXListener 接口本身的方法取决于事件的语义,但约定是它们的特征符为 void <eventOccurenceMethodName>(<EventStateObjectType> evt);。XXXListener 继承 java.util.EventObject 是很重要的。如果不是这样,则除非提供特定的 BeanInfo,否则不会发现事件。

事件的一个示例是 JavaBean java.awt.Component,当将鼠标移动到它上面时,会产生事件。侦听器接口 java.awt.event.MouseMotionListener 实现下面两个方法:

要添加鼠标侦听器,java.awt.Component 有下面两个方法:

事件的第二种样式由 JavaBean 在属性值更改时生成。这种情况的一个示例为 javax.swing.JButton 的“enabled”属性。更改其值时触发事件的属性称为绑定属性。并不是每个绑定属性都有单独的侦听器接口,而是有一个通用侦听器接口 java.beans.PropertyChangeListener,它有一个回调方法 void propertyCanged(PropertyChangeEvent evt);。自变量 PropertyChangeEvent 有三个方法,可以通过方法的接收器来查询它们:

String getPropertyName() 在 JavaBean 上更改的导致触发事件的属性的名称
Object getNewValue() 属性的新值
Object getOldValue() 属性更改前的值

要注册感兴趣的 JavaBean 的属性更改,可以使用两个方法:void addPropertyChangeListener(PropertyChangeListener listener);void addPropertyChangeListener(String propertyName, PropertyChangeListener listener);

这两种方法的第一种总是存在于具有绑定属性的 JavaBean 上。但是,第二种方法是可选的,并且取决于 JavaBean 的作者使用的事件注册的样式。例如,AWT 组件使用属性更改注册的第一种样式,而 Swing 组件两种样式都使用。

对于使用事件,存在三个对象:

  1. 产生事件的 JavaBean(源)
  2. 从源接收通知的类(侦听器)
  3. 实现回调侦听器时发生的逻辑的类

通常合并最后两个对象,以便执行逻辑的类直接实现侦听器接口或使用内部类。Visual Editor for Java 识别和生成的代码样式在有关“事件代码生成”的章节中讨论。

适配器类

许多侦听器接口都具有多个回调方法。一个示例是 java.awt.FocusListener,它具有两个方法;focusGained(java.awt.FocusEvent event) 和 focusLost(java.awt.FocusEvent event)。当创建实现该接口的侦听器类时,Java 编译器坚持实现所有接口方法,这通常导致创建许多空的方法,以满足只有一个方法或一些方法实际包含代码时的需求。以下语句显示了一个 FocusListener,当 Java bean 获得焦点时,使用该 FocusListener 来执行一些逻辑。但是,必须提供空的 focusLost 方法。

javaBean.addFocusListener(new java.awt.event.FocusListener() {     
    public void focusGained(java.awt.event.FocusEvent e) {         
        doFocusGainedCode();     
     }         
        public void focusLost(java.awt.event.FocusEvent e) {     
     }
});

为了避免许多侦听器具有空侦听器方法,提供了适配器类。这些类实现侦听器接口并提供其方法的空操作(no-op)实现。其优点是侦听器可以继承这些类,并且只提供选择的专用方法而不必提供其余方法的缺省实现(这些实现是从适配器继承的)。

javaBean.addFocusListener(new java.awt.event.FocusAdapter() {     
     public void focusGained(java.awt.event.FocusEvent e) {          
         doFocusGainedCode();      
         }  
   });

Visual Editor 能够识别和使用适配器类,BeanInfo 事件一节描述了可以如何使您自己的事件的适配器类与 Visual Editor 相关联。

上级主题:使用 Visual Editor 来处理事件

(C) Copyright IBM Corporation 1999, 2004. All Rights Reserved.