Класс EventHandler
- java.lang.Object
-
- java.beans.EventHandler
- Все реализованные интерфейсы:
InvocationHandler
public class EventHandler extends Object implements InvocationHandler
Класс EventHandler предоставляет поддержку для динамического создания обработчиков событий, методы которых выполняют простое операторное выражение, вовлекая в него объект события и целевой объект.
Класс EventHandler предназначен для использования интерактивными инструментами, такими как конструкторы приложений, которые позволяют разработчикам создавать связи между компонентами. Как правило, связи устанавливаются от компонента пользовательского интерфейса (источника события) к компоненту логики приложения (цели). Наиболее эффективные связи такого рода изолируют логику приложения от пользовательского интерфейса. Например, обработчик для связи из JCheckBox с методом, принимающим булево значение, может извлекать состояние флажка и передавать его непосредственно методу, тем самым изолируя метод от слоя пользовательского интерфейса.
Вложенные классы — это другой, более общий способ обработки событий из пользовательских интерфейсов. Класс EventHandler обрабатывает только подмножество того, что возможно с помощью вложенных классов. Однако EventHandler работает лучше с долгосрочной схемой хранения, чем вложенные классы. Кроме того, использование EventHandler в больших приложениях, в которых один и тот же интерфейс реализуется многократно, может уменьшить размер файлов и объем памяти приложения.
Причина, по которой обработчики, созданные с помощью EventHandler, имеют такой небольшой размер, заключается в том, что класс Proxy, на котором полагается класс EventHandler, разделяет реализации идентичных интерфейсов. Например, если вы используете методы EventHandler create для создания всех ActionListener в приложении, все обработчики событий будут экземплярами одного класса (одного созданного классом Proxy). В общем случае, обработчики, основанные на классе Proxy, требуют создания одного класса обработчика на каждый тип обработчика (интерфейс), в то время как подход с вложенными классами требует создания одного класса на каждый обработчик (объект, реализующий интерфейс).
Обычно вы не работаете напрямую с экземплярами EventHandler. Вместо этого вы используете один из методов EventHandler create для создания объекта, реализующего заданный интерфейс обработчика. Этот объект обработчика использует объект EventHandler за кулисами для инкапсуляции информации о событии, объекте, которому будет отправлено сообщение при возникновении события, сообщении (методе), которое должно быть отправлено, и любом аргументе метода. В следующем разделе приведены примеры создания объектов обработчиков с помощью методов create.
Примеры использования EventHandler
Самое простое использование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 заключается в извлечении значения свойства из первого аргумента метода в интерфейсе обработчика (обычно объект события) и использовании его для установки значения свойства в целевом объекте. В следующем примере мы создаём обработчик ActionListener, который устанавливает свойство nextFocusableComponent целевого объекта (объекта myButton) в значение свойства "source" события. 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, который устанавливает свойство "label" целевого объекта в значение свойства "text" источника (свойства "source") события. 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());
}
} Свойство события может быть "квалифицировано" произвольным числом префиксов свойств, разделённых символом ".". Квалифицирующие имена, появляющиеся перед символами ".", рассматриваются как имена свойств, которые должны применяться к объекту события, слева направо. Например, следующий обработчик событий
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.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.getA().setB(e.getC().isD());
}
} Так как EventHandler в конечном итоге полагается на рефлексию для вызова метода, мы не рекомендуем применять целевой перегруженный метод. Например, если цель является экземпляром класса MyTarget, который определён как:
public class MyTarget {
public void doIt(String);
public void doIt(Object);
} Тогда метод doIt перегружен. EventHandler вызовет метод, который соответствует источнику. Если источник равен null, то любой из методов подходит, и тот, который вызывается, не определён. По этой причине мы не рекомендуем применять целевые перегруженные методы.- С:
- 1.4
- См. также:
-
Proxy,EventObject
Конструкторы
| Конструктор | Описание |
|---|---|
EventHandler(Object target,
String action,
String eventPropertyName,
String listenerMethodName) | Создаёт новый объект |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
static <T> T | create(Class<T> listenerInterface,
Object target,
String action) | Создаёт реализацию интерфейса |
static <T> T | create(Class<T> listenerInterface,
Object target,
String action,
String eventPropertyName) | /** Создаёт реализацию интерфейса |
static <T> T | create(Class<T> listenerInterface,
Object target,
String action,
String eventPropertyName,
String listenerMethodName) | Создаёт реализацию интерфейса |
String | getAction() | Возвращает имя записываемого свойства цели, которое этот обработчик событий установит, или имя метода, который этот обработчик событий вызовет у цели. |
String | getEventPropertyName() | Возвращает свойство события, которое должно быть использовано в действии, применённом к цели. |
String | getListenerMethodName() | Возвращает имя метода, который вызовет действие. |
Object | getTarget() | Возвращает объект, которому этот обработчик событий отправит сообщение. |
Object | invoke(Object proxy,
Method method,
Object[] arguments) | Извлекает соответствующее значение свойства из события и передаёт его действию, связанному с этим |
Методы, унаследованные от класса java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Конструкторы
EventHandler
@ConstructorProperties({"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равно null -
NullPointerException- еслиactionравно null - См. также:
-
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.
- Задано в:
-
invokeв интерфейсеInvocationHandler - Параметры:
-
proxy- объект прокси -
method- метод в интерфейсе слушателя -
arguments- массив объектов, содержащих значения аргументов, переданных в вызов метода на экземпляре прокси, илиnull, если метод интерфейса не принимает аргументов. Аргументы примитивных типов обернуты в экземпляры соответствующего класса-обертки примитивного типа, такого какjava.lang.Integerилиjava.lang.Boolean. - Возвращает:
- результат применения действия к цели
- См. также:
EventHandler
create
public static <T> T create(Class<T> listenerInterface,
Object target,
String action) Создаёт реализацию listenerInterface, в которой все методы в интерфейсе слушателя применяют обработчик к target. Этот метод реализован вызовом другого, более общего, метода create с обеими eventPropertyName и listenerMethodName, принимающими значение null. Подробное описание параметра action см. в the general version of create.
Для создания ActionListener показывающего JDialog с dialog.show(), можно написать:
EventHandler.create(ActionListener.class, dialog, "show")
- Параметры типа:
-
T- тип для создания - Параметры:
-
listenerInterface- интерфейс слушателя для создания прокси -
target- объект, который выполнит действие -
action- имя (возможно, квалифицированное) свойства или метода в целевом объекте - Возвращает:
- объект, реализующий
listenerInterface - Исключения:
-
NullPointerException- еслиlistenerInterfaceравно null -
NullPointerException- еслиtargetравно null -
NullPointerException- еслиactionравно null -
IllegalArgumentException- если создание прокси дляlistenerInterfaceтерпит неудачу по каким-либо ограничениям, указанным вProxy.newProxyInstance(java.lang.ClassLoader, java.lang.Class<?>[], java.lang.reflect.InvocationHandler) - См. также:
-
create(Class, Object, String, String),Proxy.newProxyInstance(java.lang.ClassLoader, java.lang.Class<?>[], java.lang.reflect.InvocationHandler)
create
public static <T> T create(Class<T> listenerInterface,
Object target,
String action,
String eventPropertyName) /** Создаёт реализацию listenerInterface, в которой все методы передают значение выражения события eventPropertyName в конечный метод в инструкции action, который применяется к target. Этот метод реализован вызовом более общей реализации метода create с listenerMethodName, принимающим значение null. Подробное описание параметров action и eventPropertyName см. в the general version of create.
Для создания ActionListener устанавливающего текст JLabel в текстовое значение источника JTextField входящего события, можно использовать следующий код:
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равно null -
NullPointerException- еслиtargetравно null -
NullPointerException- еслиactionравно null -
IllegalArgumentException- если создание прокси дляlistenerInterfaceтерпит неудачу по каким-либо ограничениям, указанным вProxy.newProxyInstance(java.lang.ClassLoader, java.lang.Class<?>[], java.lang.reflect.InvocationHandler) - См. также:
-
create(Class, Object, String, String, String),Proxy.newProxyInstance(java.lang.ClassLoader, java.lang.Class<?>[], java.lang.reflect.InvocationHandler)
create
public static <T> T create(Class<T> listenerInterface,
Object target,
String action,
String eventPropertyName,
String listenerMethodName) Создаёт реализацию listenerInterface, в которой метод с именем listenerMethodName передаёт значение выражения события eventPropertyName в конечный метод в инструкции action, который применяется к target. Все остальные методы слушателя ничего не делают.
Строка eventPropertyName используется для извлечения значения из объекта входящего события, которое передаётся целевому методу. В общем случае целевой метод не принимает аргументы, в этом случае значение null должно использоваться для eventPropertyName. В качестве альтернативы, если вы хотите передать непосредственно объект входящего события целевому методу, используйте пустую строку. Формат строки eventPropertyName — это последовательность методов или свойств, где каждый метод или свойство применяется к значению, возвращённому предыдущим методом, начиная с объекта входящего события. Синтаксис: propertyName{.propertyName}*, где propertyName соответствует методу или свойству. Например, для извлечения свойства point из MouseEvent, можно использовать "point" или "getPoint" в качестве eventPropertyName. Для извлечения свойства "text" из MouseEvent с источником JLabel можно использовать любой из следующих вариантов в качестве eventPropertyName: "source.text", "getSource.text" "getSource.getText" или "source.getText". Если метод не найден или при вызове метода генерируется исключение, исключение будет выброшено во время диспетчеризации. Например, если объект входящего события равен null, а eventPropertyName не равен null и не пустой, будет выброшено исключение RuntimeException.
Аргумент action имеет тот же формат, что и аргумент eventPropertyName, где последнее имя свойства идентифицирует имя метода или записываемое свойство.
Если listenerMethodName равно null, все методы в интерфейсе вызывают выполнение action на target.
Например, для создания MouseListener устанавливающего свойство origin целевого объекта в значение расположения входящего MouseEvent (это значение mouseEvent.getPoint()), каждый раз при нажатии клавиши мыши, нужно написать:
EventHandler.create(MouseListener.class, target, "origin", "point", "mousePressed");Это аналогично написанию
MouseListener в котором все методы, кроме mousePressed, являются no-op: //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равно null -
NullPointerException- еслиtargetравно null -
NullPointerException- еслиactionравно null -
IllegalArgumentException- если создание прокси дляlistenerInterfaceзавершается ошибкой по каким-либо ограничениям, указанным вProxy.newProxyInstance(java.lang.ClassLoader, java.lang.Class<?>[], java.lang.reflect.InvocationHandler) - См. также:
-
EventHandler,Proxy.newProxyInstance(java.lang.ClassLoader, java.lang.Class<?>[], java.lang.reflect.InvocationHandler)
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/11/docs/api/java.desktop/java/beans/EventHandler.html