JavaTM 2 Platform
Standard Ed. 5.0

java.beans
类 EventHandler

java.lang.Object
  继承者 java.beans.EventHandler
所有已实现的接口:
InvocationHandler

public class EventHandler
extends Object
implements InvocationHandler

EventHandler 类为动态生成事件侦听器提供支持,这些侦听器的方法执行一条涉及传入事件对象和目标对象的简单语句。

EventHandler 类由交互工具(比如应用程序生成器)使用,这些工具允许开发人员在 bean 之间建立连接。通常是建立从用户界面 bean(事件 source)到应用程序逻辑 bean(target)的连接。大多数这类有效连接隔离了应用程序逻辑与用户界面。例如,用于从 JCheckBox 到接受 boolean 值的方法之间连接的 EventHandler 可以提取复选框的状态,并将其直接传递给该方法,从而使该方法与用户界面层隔离。

内部类是处理来自用户界面的事件的另一种更常见方法。EventHandler 类只处理可能使用内部类的事件的子集。不过,EventHandler 使用长期持久方案要比使用内部类更有效。同样,在同一接口被实现很多次的大型应用程序中,使用 EventHandler 可以减少应用程序的磁盘和内存占用。

使用 EventHandler 创建侦听器占用内存如此之少的原因是,EventHandler 所依赖的 Proxy 类共享了同一接口的实现。例如,如果使用 EventHandlercreate 方法生成某个应用程序中的所有 ActionListener,则所有动作侦听器都将是单个类(由 Proxy 类创建)的实例。通常,基于 Proxy 类的侦听器要求为每个侦听器类型(接口)创建一个侦听器类,而使用内部类时要求为每个侦听器(实现接口的对象)创建一个类。

通常不需要直接处理 EventHandler 实例。相反,可使用 EventHandlercreate 方法之一创建实现给定侦听器接口的对象。此侦听器对象在后台使用一个 EventHandler 对象来封装关于事件的信息、发生事件时接收消息的对象、要发送的消息(方法)和方法的任意参数。以下部分给出了如何使用 create 方法创建侦听器对象的示例。

使用 EventHandler 的示例

EventHandler 最简单的使用方法是安装一个侦听器,不带参数地在目标对象上调用某个方法。在以下示例中,将创建一个在 javax.swing.JFrame 的实例上调用 toFront 方法的 ActionListener
myButton.addActionListener(
    (ActionListener)EventHandler.create(ActionListener.class, frame, "toFront"));
当按下 myButton 时,将执行 frame.toFront() 语句。通过定义 ActionListener 接口的新实现并将其实例添加到按钮中,用户可以获得同样的效果,且具有额外的编译时类型安全:
//Equivalent code using an inner class instead of EventHandler.
myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        frame.toFront();
    }
});
EventHandler 的另一种最简单用法是从侦听器接口(通常是一个事件对象)中的方法的第一个参数中提取属性值,并用其设置目标对象中的属性值。在以下示例中,将创建一个 ActionListener,它将目标对象的 nextFocusableComponent 属性设置为事件的 "source" 属性的值。
EventHandler.create(ActionListener.class, target, "nextFocusableComponent", "source")
这将对应于以下内部类实现:
//Equivalent code using an inner class instead of EventHandler.
new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        button.setNextFocusableComponent((Component)e.getSource()); 
    }
}
EventHandler 最常见的用法可能是从事件对象的 source 中提取属性值,并将此值设置为目标对象的属性值。在以下示例中,将创建一个 ActionListener,它将目标对象的 "label" 属性设置为事件源的 "text" 属性的值("source" 属性的值)。
EventHandler.create(ActionListener.class, button, "label", "source.text")
这将对应于以下内部类实现:
//Equivalent code using an inner class instead of EventHandler.
new ActionListener {
    public void actionPerformed(ActionEvent e) {
        button.setLabel(((JTextField)e.getSource()).getText()); 
    }
}
可以使用以 "." 字符分隔的任意数量的属性前缀来“限定”事件属性。采用出现在 "." 字符前面的“限定”名称作为将应用于事件对象的属性名称,最左边的最先应用。

例如,以下动作侦听器

EventHandler.create(ActionListener.class, target, "a", "b.c.d")
可以写成以下内部类(假定所有属性都有规范的 getter 方法并返回适当的类型):
//Equivalent code using an inner class instead of EventHandler.
new ActionListener {
    public void actionPerformed(ActionEvent e) {
        target.setA(e.getB().getC().isD()); 
    }
}

从以下版本开始:
1.4
另请参见:
Proxy, EventObject

构造方法摘要
EventHandler(Object target, String action, String eventPropertyName, String listenerMethodName)
          创建一个新的 EventHandler 对象;通常使用 create 方法之一,而不是直接调用此构造方法。
 
方法摘要
static
<T> T
create(Class<T> listenerInterface, Object target, String action)
          创建 listenerInterface 的实现,在该实现中,侦听器接口中的所有 方法都会将处理程序的 action 应用到 target
static
<T> T
create(Class<T> listenerInterface, Object target, String action, String eventPropertyName)
          创建 listenerInterface 的实现,在该实现中,所有 方法都会将事件表达式的值 eventPropertyName 传递给语句中的最终方法 action,后者被应用于 target
static
<T> T
create(Class<T> listenerInterface, Object target, String action, String eventPropertyName, String listenerMethodName)
          创建 listenerInterface 的实现,在该实现中,名为 listenerMethodName 的方法将事件表达式的值 eventPropertyName 传递给语句中的最终方法 action,后者被应用于 target
 String getAction()
          返回此事件处理程序将设置的目标的可写属性名称,或者此事件处理程序将在目标上调用的方法的名称。
 String getEventPropertyName()
          返回应该在应用于目标的动作中使用的事件的属性。
 String getListenerMethodName()
          返回将触发动作的属性的名称。
 Object getTarget()
          返回此事件处理程序将为其发送消息的对象。
 Object invoke(Object proxy, Method method, Object[] arguments)
          从事件中提取适当属性值,并将其传递到与此 EventHandler 相关联的动作。
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

EventHandler

public EventHandler(Object target,
                    String action,
                    String eventPropertyName,
                    String listenerMethodName)
创建一个新的 EventHandler 对象;通常使用 create 方法之一,而不是直接调用此构造方法。

参数:
target - 将执行动作的对象
action - 目标上的一个可写属性或方法的(可能受限定的)名称
eventPropertyName - 传入事件的一个可读属性的(可能受限定的)名称
listenerMethodName - 应该触发该动作的侦听器接口中的方法名称
另请参见:
EventHandler, create(Class, Object, String, String, String), getTarget(), getAction(), getEventPropertyName(), getListenerMethodName()
方法详细信息

getTarget

public Object getTarget()
返回此事件处理程序将为其发送消息的对象。

返回:
此事件处理程序的目标
另请参见:
EventHandler(Object, String, String, String)

getAction

public String getAction()
返回此事件处理程序将设置的目标的可写属性名称,或者此事件处理程序将在目标上调用的方法的名称。

返回:
此事件处理程序的动作
另请参见:
EventHandler(Object, String, String, String)

getEventPropertyName

public String getEventPropertyName()
返回应该在应用于目标的动作中使用的事件的属性。

返回:
事件的属性
另请参见:
EventHandler(Object, String, String, String)

getListenerMethodName

public String getListenerMethodName()
返回将触发动作的属性的名称。返回值为 null 表示侦听器接口中的所有方法都将触发该动作。

返回:
将触发该动作的方法的名称
另请参见:
EventHandler(Object, String, String, String)

invoke

public Object invoke(Object proxy,
                     Method method,
                     Object[] arguments)
从事件中提取适当属性值,并将其传递到与此 EventHandler 相关联的动作。

指定者:
接口 InvocationHandler 中的 invoke
参数:
proxy - 代理对象
method - 侦听器接口中的方法
arguments - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。基本类型的参数被包装在适当基本包装器类(如 java.lang.Integerjava.lang.Boolean)的实例中。
返回:
对目标应用该操作的结果
另请参见:
EventHandler

create

public static <T> T create(Class<T> listenerInterface,
                           Object target,
                           String action)
创建 listenerInterface 的实现,在该实现中,侦听器接口中的所有 方法都会将处理程序的 action 应用到 target。此方法是通过调用其他更常见的 create 方法实现来实现的,其中 eventPropertyNamelistenerMethodName 都采用 null 值。

要创建一个使用 dialog.show() 显示 JDialogActionListener,用户可以编写以下代码:

EventHandler.create(ActionListener.class, dialog, "show")

参数:
listenerInterface - 要为其创建代理的侦听器接口
target - 将执行动作的对象
action - 目标上的某个可写属性或方法的名称
返回:
实现 listenerInterface 的对象
另请参见:
create(Class, Object, String, String)

create

public static <T> T create(Class<T> listenerInterface,
                           Object target,
                           String action,
                           String eventPropertyName)
创建 listenerInterface 的实现,在该实现中,所有 方法都会将事件表达式的值 eventPropertyName 传递给语句中的最终方法 action,后者被应用于 target。此方法是通过调用更常见的 create 方法实现来实现的,其中 listenerMethodName 采用 null 值。

要创建一个将 JLabel 的文本设置为传入事件 JTextField 源的值的 ActionListener,可以使用以下代码:

EventHandler.create(ActionListener.class, label, "text", "source.text");
这等同于以下代码:
//Equivalent code using an inner class instead of EventHandler.
label.setText((JTextField(event.getSource())).getText()) 

参数:
listenerInterface - 要为其创建代理的侦听器接口
target - 将执行动作的对象
action - 目标上的某个可写属性或方法的名称
eventPropertyName - 传入事件的某个可读属性的(可能受限定的)名称
返回:
实现 listenerInterface 的对象
另请参见:
create(Class, Object, String, String, String)

create

public static <T> T create(Class<T> listenerInterface,
                           Object target,
                           String action,
                           String eventPropertyName,
                           String listenerMethodName)
创建 listenerInterface 的实现,在该实现中,名为 listenerMethodName 的方法将事件表达式的值 eventPropertyName 传递给语句中的最终方法 action,后者被应用于 target。其他所有侦听器方法不执行任何操作。

如果 eventPropertyNamenull,则该实现使用 action 中指定的名称调用一个方法,该方法接受 EventObject,如果没有定义接受 EventObject 的方法,则调用同名称的无参数方法。

如果 listenerMethodNamenull,则接口中的所有 方法都会触发将在 target 上执行的 action

例如,要创建一个 MouseListener,使其在每次按下鼠标按键时,都将目标对象的 origin 属性设置为传入 MouseEvent 的位置(即 mouseEvent.getPoint() 的值),则应编写以下代码:

EventHandler.create(MouseListener.class, "mousePressed", target, "origin", "point");
这相当于编写一个 MouseListener,其中除 mousePressed 以外的所有方法都是无操作 (no-op):
//Equivalent code using an inner class instead of EventHandler.
new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
        target.setOrigin(e.getPoint());
    }
}
 

参数:
listenerInterface - 要为其创建代理的侦听器接口
target - 将执行动作的对象
action - 目标上的某个可写属性或方法的名称
eventPropertyName - 传入事件的某个可读属性的(可能受限定的)名称
listenerMethodName - 应触发该动作的侦听器接口中的方法的名称
返回:
实现 listenerInterface 的对象
另请参见:
EventHandler

JavaTM 2 Platform
Standard Ed. 5.0

提交错误或意见
有关更多的 API 参考资料和开发人员文档,请参阅 Java 2 SDK SE 开发人员文档。该文档包含更详细的、面向开发人员的描述,以及总体概述、术语定义、使用技巧和工作代码示例。

版权所有 2004 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策