|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
上一个类 下一个类 | 框架 无框架 | |||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
java.lang.Object java.beans.EventHandler
public class EventHandler
EventHandler
类为动态生成事件侦听器提供支持,这些侦听器的方法执行一条涉及传入事件对象和目标对象的简单语句。
EventHandler
类由交互工具(比如应用程序生成器)使用,这些工具允许开发人员在 bean 之间建立连接。通常是建立从用户界面 bean(事件 source)到应用程序逻辑 bean(target)的连接。大多数这类有效连接隔离了应用程序逻辑与用户界面。例如,用于从 JCheckBox
到接受 boolean 值的方法之间连接的 EventHandler
可以提取复选框的状态,并将其直接传递给该方法,从而使该方法与用户界面层隔离。
内部类是处理来自用户界面的事件的另一种更常见方法。EventHandler
类只处理可能使用内部类的事件的子集。不过,EventHandler
使用长期持久方案要比使用内部类更有效。同样,在同一接口被实现很多次的大型应用程序中,使用 EventHandler
可以减少应用程序的磁盘和内存占用。
使用 EventHandler
创建侦听器占用内存如此之少的原因是,EventHandler
所依赖的 Proxy
类共享了同一接口的实现。例如,如果使用 EventHandler
的 create
方法生成某个应用程序中的所有 ActionListener
,则所有动作侦听器都将是单个类(由 Proxy
类创建)的实例。通常,基于 Proxy
类的侦听器要求为每个侦听器类型(接口)创建一个侦听器类,而使用内部类时要求为每个侦听器(实现接口的对象)创建一个类。
通常不需要直接处理 EventHandler
实例。相反,可使用 EventHandler
的 create
方法之一创建实现给定侦听器接口的对象。此侦听器对象在后台使用一个 EventHandler
对象来封装关于事件的信息、发生事件时接收消息的对象、要发送的消息(方法)和方法的任意参数。以下部分给出了如何使用 create
方法创建侦听器对象的示例。
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()); } }
例如,以下动作侦听器
可以写成以下内部类(假定所有属性都有规范的 getter 方法并返回适当的类型):EventHandler.create(ActionListener.class, target, "a", "b.c.d")
//Equivalent code using an inner class instead of EventHandler. new ActionListener { public void actionPerformed(ActionEvent e) { target.setA(e.getB().getC().isD()); } }
Proxy
,
EventObject
构造方法摘要 | |
---|---|
EventHandler(Object target,
String action,
String eventPropertyName,
String listenerMethodName)
创建一个新的 EventHandler 对象;通常使用 create 方法之一,而不是直接调用此构造方法。 |
方法摘要 | ||
---|---|---|
static
|
create(Class<T> listenerInterface,
Object target,
String action)
创建 listenerInterface 的实现,在该实现中,侦听器接口中的所有 方法都会将处理程序的 action 应用到 target 。 |
|
static
|
create(Class<T> listenerInterface,
Object target,
String action,
String eventPropertyName)
创建 listenerInterface 的实现,在该实现中,所有 方法都会将事件表达式的值 eventPropertyName 传递给语句中的最终方法 action ,后者被应用于 target 。 |
|
static
|
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 |
构造方法详细信息 |
---|
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()
方法详细信息 |
---|
public Object getTarget()
EventHandler(Object, String, String, String)
public String getAction()
EventHandler(Object, String, String, String)
public String getEventPropertyName()
EventHandler(Object, String, String, String)
public String getListenerMethodName()
null
表示侦听器接口中的所有方法都将触发该动作。
EventHandler(Object, String, String, String)
public Object invoke(Object proxy, Method method, Object[] arguments)
EventHandler
相关联的动作。
InvocationHandler
中的 invoke
proxy
- 代理对象method
- 侦听器接口中的方法arguments
- 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null
。基本类型的参数被包装在适当基本包装器类(如 java.lang.Integer
或 java.lang.Boolean
)的实例中。
EventHandler
public static <T> T create(Class<T> listenerInterface, Object target, String action)
listenerInterface
的实现,在该实现中,侦听器接口中的所有 方法都会将处理程序的 action
应用到 target
。此方法是通过调用其他更常见的 create
方法实现来实现的,其中 eventPropertyName
和 listenerMethodName
都采用 null
值。
要创建一个使用 dialog.show()
显示 JDialog
的 ActionListener
,用户可以编写以下代码:
EventHandler.create(ActionListener.class, dialog, "show")
listenerInterface
- 要为其创建代理的侦听器接口target
- 将执行动作的对象action
- 目标上的某个可写属性或方法的名称
listenerInterface
的对象create(Class, Object, String, String)
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)
public static <T> T create(Class<T> listenerInterface, Object target, String action, String eventPropertyName, String listenerMethodName)
listenerInterface
的实现,在该实现中,名为 listenerMethodName
的方法将事件表达式的值 eventPropertyName
传递给语句中的最终方法 action
,后者被应用于 target
。其他所有侦听器方法不执行任何操作。
如果 eventPropertyName
为 null
,则该实现使用 action
中指定的名称调用一个方法,该方法接受 EventObject
,如果没有定义接受 EventObject
的方法,则调用同名称的无参数方法。
如果 listenerMethodName
为 null
,则接口中的所有 方法都会触发将在 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 |
|||||||||
上一个类 下一个类 | 框架 无框架 | |||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
版权所有 2004 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策。