public class EventHandler extends Object implements InvocationHandler
EventHandler
类提供动态生成的事件监听器的方法执行一个简单的声明涉及传入的事件对象和目标对象的支持。
的EventHandler
班的目的是通过交互式工具的使用,如应用程序生成器,允许开发人员之间进行连接的豆子。通常连接是由一个用户界面的豆(事件源)到一个应用程序逻辑豆(目标)。这种最有效的连接将应用程序逻辑从用户界面分离出来。例如,一个连接从JCheckBox
一方法接受一个布尔值EventHandler
可以处理复选框的状态,通过直接提取的方法,该方法从用户界面层分离。
内部类是另一种更普遍的方式来处理用户界面上的事件。的EventHandler
类只处理什么是可能使用内部类的一个子集。然而,EventHandler
工作更好地与长期持久方案比内部类。同时,利用EventHandler
在大型应用中,相同的接口实现多次可以减少磁盘和内存的应用程序的足迹。
创建与EventHandler
听众有这样一个小面积的原因是Proxy
类,该EventHandler
依赖,股价实现相同的接口。例如,如果你使用EventHandler
create
方法中使所有的ActionListener
s,所有行动的听众将一个类的实例(一个由Proxy
类创建)。一般来说,基于Proxy
类听众需要一个监听器类被创建监听器类(接口),而内部类的方法需要一个类来创建监听器(对象实现的接口)。
你一般不直接与EventHandler
实例处理。相反,你使用的EventHandler
create
方法创建实现了Listener接口对象。这个监听器对象使用一个幕后的EventHandler
对象封装有关事件的信息,对象是发送一条消息,当事件发生时,消息(方法)来,和任何参数的方法。下面举例说明如何使用create
方法创建侦听器对象。
EventHandler
是安装一个监听器调用一个不带参数的目标对象的方法。在下面的例子中,我们创建了一个
ActionListener
调用
toFront
方法对
javax.swing.JFrame
实例。
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
是从监听器接口的方法的第一个参数提取属性值(通常是一个事件对象)用它来套在目标对象的属性值。在下面的例子中我们创建一套目标
nextFocusableComponent
财产
ActionListener
(色)对象的价值的“源”的事件属性。
这将符合下列内部类的实现:EventHandler.create(ActionListener.class, myButton, "nextFocusableComponent", "source")
也可能创建一个仅仅通过传入的事件对象的目标的行动//Equivalent code using an inner class instead of EventHandler. new ActionListener() { public void actionPerformed(ActionEvent e) { myButton.setNextFocusableComponent((Component)e.getSource()); } }
EventHandler
。如果第四
EventHandler.create
参数为空字符串,然后事件只是走过:
这将符合下列内部类的实现:EventHandler.create(ActionListener.class, target, "doActionEvent", "")
可能//Equivalent code using an inner class instead of EventHandler. new ActionListener() { public void actionPerformed(ActionEvent e) { target.doActionEvent(e); } }
EventHandler
最常见的用途是从事件源对象中提取属性值和设定值作为目标对象的一个属性的值。在下面的示例中,我们创建了一个
ActionListener
设置“标签”的目标对象属性值的“文本”的源属性(价值的“源”属性)的事件。
这将符合下列内部类的实现:EventHandler.create(ActionListener.class, myButton, "label", "source.text")
事件属性可能是“合格”的性质与“前缀分隔的任意数量的字符。”。“限定”出现在“之前”的名称。字符被作为应该应用的属性的名称,留下最多的第一个,到事件对象。//Equivalent code using an inner class instead of EventHandler. new ActionListener { public void actionPerformed(ActionEvent e) { myButton.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()); } }
EventHandler。创造(ActionListener.class,目标,“内压”、“C.”)可以写成如下的内部类(假设所有的性能都有典型的getter方法并返回适当的类型):
/ /等效代码使用一个内部类代替EventHandler。新功能{public void actionPerformed(ActionEvent e){目标。geta()。SETB(E. getc()。isd());}}
作为EventHandler
最终依靠反射来调用一个方法,我们建议针对重载方法。例如,如果目标是班级MyTarget
作为实例:
公共课mytarget {公共无效做(字符串);公共无效做(对象);}然后
doIt
过载的方法。EventHandler将调用的方法是基于源的适当。如果源是空的,那么任何一种方法都是合适的,而调用的方法是不确定的。为了这个原因,我们建议针对过载的方法。
Proxy
,
EventObject
Constructor and Description |
---|
EventHandler(Object target, String action, String eventPropertyName, String listenerMethodName)
创建一个新的
EventHandler 对象;你通常使用一个调用此构造函数,而不是直接的
create 方法。
|
Modifier and Type | Method and Description |
---|---|
static <T> T |
create(类<T> listenerInterface, Object target, String action)
创建
listenerInterface 其中所有的监听器接口的应用程序的
action 的
target 实现。
|
static <T> T |
create(类<T> listenerInterface, Object target, String action, String eventPropertyName)
/ * *创建
listenerInterface 其中所有的方法通过事件表达的价值
eventPropertyName 实现,到最终的方法在声明中,
action ,适用于
target 。
|
static <T> T |
create(类<T> listenerInterface, Object target, String action, String eventPropertyName, String listenerMethodName)
创建的方法称为
listenerMethodName 通过事件表达的价值
eventPropertyName
listenerInterface 实现,到最终的方法在声明中,
action ,适用于
target 。
|
String |
getAction()
返回此事件处理程序将设定目标的可写属性的名称,或是此事件处理程序将调用目标方法的名称。
|
String |
getEventPropertyName()
返回用于应用于目标的操作的事件的属性。
|
String |
getListenerMethodName()
返回将触发该动作的方法的名称。
|
Object |
getTarget()
返回此事件处理程序将发送消息的对象。
|
Object |
invoke(Object proxy, 方法 method, Object[] arguments)
从事件中提取相应的属性值,通过它与这个
EventHandler 有关的行动。
|
@ConstructorProperties(value={"target","action","eventPropertyName","listenerMethodName"}) public EventHandler(Object target, String action, String eventPropertyName, String listenerMethodName)
EventHandler
对象;你通常使用一个调用此构造函数,而不是直接的
create
方法。参考
the general version of create
为一个完整的描述的
eventPropertyName
和
listenerMethodName
参数。
target
-将执行动作的对象
action
-一个名字(可能合格)对目标属性或方法
eventPropertyName
-(可能合格)的传入事件可读属性名称
listenerMethodName
在监听器接口应该触发动作名称的方法
NullPointerException
-如果
target
是空的
NullPointerException
-如果
action
是空的
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, Object[] arguments)
EventHandler
有关的行动。
invoke
接口
InvocationHandler
proxy
-代理对象
method
-监听器接口的方法
arguments
-包含在方法上通过代理实例调用的实参的值对象的数组,或
null
如果接口方法不需要参数。原始类型的实参是包裹在适当的原始包装类的实例,如
java.lang.Integer
或
java.lang.Boolean
。
EventHandler
public static <T> T create(类<T> listenerInterface, Object target, String action)
listenerInterface
其中所有的监听器接口的应用程序的
action
的
target
实现。这种方法是通过调用,实现更一般的,都
eventPropertyName
和
listenerMethodName
以价值
null
的
create
方法实现。指
the general version of create
action
参数的完整描述。
创建一个ActionListener
显示一个JDialog
与dialog.show()
,可以写:
EventHandler.create(ActionListener.class, dialog, "show")
T
型创造
listenerInterface
-监听器接口创建代理
target
-将执行动作的对象
action
-一个名字(可能合格)对目标属性或方法
listenerInterface
对象
NullPointerException
-如果
listenerInterface
是空的
NullPointerException
-如果
target
是空的
NullPointerException
-如果
action
是空的
create(Class, Object, String, String)
public static <T> T create(类<T> listenerInterface, Object target, String action, String eventPropertyName)
listenerInterface
其中所有的方法通过事件表达的价值
eventPropertyName
实现,到最终的方法在声明中,
action
,适用于
target
。这种方法是通过调用更一般的执行,与
listenerMethodName
以价值
null
的
create
方法的实现。参考
the general version of create
为一个完整的描述的
action
和
eventPropertyName
参数。
创建设置文本的JLabel
对输入事件的JTextField
源文本的价值ActionListener
,你可以使用下面的代码:
这等价于下面的代码:EventHandler.create(ActionListener.class, label, "text", "source.text");
//Equivalent code using an inner class instead of EventHandler. new ActionListener() { public void actionPerformed(ActionEvent event) { label.setText(((JTextField)(event.getSource())).getText()); } };
T
型创造
listenerInterface
-监听器接口创建代理
target
-将执行动作的对象
action
-一个名字(可能合格)对目标属性或方法
eventPropertyName
-(可能合格)的传入事件可读属性名称
listenerInterface
对象
NullPointerException
-如果
listenerInterface
是空的
NullPointerException
-如果
target
是空的
NullPointerException
-如果
action
是空的
create(Class, Object, String, String, String)
public static <T> T create(类<T> listenerInterface, Object target, String action, String eventPropertyName, String listenerMethodName)
listenerMethodName
通过事件表达的价值
eventPropertyName
listenerInterface
实现,到最终的方法在声明中,
action
,适用于
target
。所有其他的监听方法什么都不做。
的eventPropertyName
字符串是用来从被传递到目标方法传入的事件对象中提取一个值。常见的情况是,目标方法不需要参数,在这种情况下,空值应该用于eventPropertyName
。如果您希望将传入的事件对象直接传递给目标方法,也可以使用空字符串。该eventPropertyName
字符串的格式是一个序列的方法或属性,每个属性或方法应用于价值由前面的方法从传入的事件对象返回。语法:propertyName{.propertyName}*
哪里propertyName
匹配方法或属性。例如,从一个MouseEvent
提取point
属性,你可以使用"point"
或"getPoint"
为eventPropertyName
。从一个JLabel
源MouseEvent
使用以下任何eventPropertyName
提取物作为“文本”属性:"source.text"
,"getSource.text"
"getSource.getText"
或"source.getText"
。如果一个方法可以不被发现,或生成异常的调用方法RuntimeException
将会给调度时间的一部分。例如,如果传入的事件对象为空,和eventPropertyName
非空不空,一RuntimeException
将抛出。
的action
参数是相同的格式和eventPropertyName
参数,最后的属性名称标识一个方法名称或可写的属性。
如果listenerMethodName
是null
所有方法的接口触发action
在target
执行。
例如,创建一个MouseListener
设置目标对象的origin
属性来MouseEvent
的位置(这是mouseEvent.getPoint()
值)每次按下鼠标按钮,一个会写:
这可比写一EventHandler.create(MouseListener.class, target, "origin", "point", "mousePressed");
MouseListener
除了
mousePressed
所有的方法都没有行动:
//Equivalent code using an inner class instead of EventHandler. new MouseAdapter() { public void mousePressed(MouseEvent e) { target.setOrigin(e.getPoint()); } };
T
型创造
listenerInterface
-监听器接口创建代理
target
-将执行动作的对象
action
-一个名字(可能合格)对目标属性或方法
eventPropertyName
-(可能合格)的传入事件可读属性名称
listenerMethodName
在监听器接口应该触发动作名称的方法
listenerInterface
对象
NullPointerException
-如果
listenerInterface
是空的
NullPointerException
-如果
target
是空的
NullPointerException
-如果
action
是空的
EventHandler
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.