Класс EventHandler
- Все реализуемые интерфейсы:
InvocationHandler
public class EventHandler extends Object implements InvocationHandler
EventHandler обеспечивает поддержку динамического создания прослушивателей событий, методы которых выполняют простую инструкцию с использованием входящего объекта события и целевого объекта. Класс EventHandler предназначен для использования интерактивными инструментами, такими как конструкторы приложений, которые позволяют разработчикам создавать связи между компонентами Bean. Обычно связи устанавливаются от компонента пользовательского интерфейса (источника события) к компоненту бизнес-логики приложения (целевому объекту). Наиболее эффективные связи такого рода изолируют бизнес-логику приложения от пользовательского интерфейса. Например, 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
- См. также:
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
EventHandler |
Создаёт новый объект EventHandler; обычно вместо прямого вызова этого конструктора используют один из методов create. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static <T> T |
create |
Создаёт реализацию listenerInterface, в которой все методы интерфейса прослушивателя применяют action обработчика к target. |
static <T> T |
create |
/** Создаёт реализацию listenerInterface, в которой все методы передают значение выражения события, eventPropertyName, последнему методу в инструкции, action, который применяется к target. |
static <T> T |
create |
Создаёт реализацию listenerInterface, в которой метод с именем listenerMethodName передаёт значение выражения события, eventPropertyName, последнему методу в инструкции, action, который применяется к target. |
String |
getAction() |
Возвращает имя доступного для записи свойства целевого объекта, которое установит этот обработчик событий, или имя метода, который обработчик событий вызовет для целевого объекта. |
String |
getEventPropertyName() |
Возвращает свойство события, которое следует использовать в действии, применяемом к целевому объекту. |
String |
getListenerMethodName() |
Возвращает имя метода, который запустит действие. |
Object |
getTarget() |
Возвращает объект, которому этот обработчик событий отправит сообщение. |
Object |
invoke |
Извлекает из события соответствующее значение свойства и передаёт его действию, связанному с этим EventHandler. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Указывает, равен ли другой объект этому объекту. |
protected void |
finalize() |
Устарело, будет удалено: этот элемент API может быть удалён в будущей версии. Финализация устарела и будет удалена в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает хеш-код этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Переводит текущий поток в состояние ожидания до пробуждения, обычно вследствие вызова notify или interrupt. |
final void |
wait |
Переводит текущий поток в состояние ожидания до пробуждения, обычно вследствие вызова notify или interrupt, либо до истечения заданного интервала реального времени. |
final void |
wait |
Переводит текущий поток в состояние ожидания до пробуждения, обычно вследствие вызова notify или interrupt, либо до истечения заданного интервала реального времени. |
Подробное описание конструкторов
EventHandler
@ConstructorProperties({"target","action","eventPropertyName","listenerMethodName"}) public EventHandler(Object target, String action, String eventPropertyName, String listenerMethodName) EventHandler; обычно вместо прямого вызова этого конструктора используют один из методов create. Полное описание параметров eventPropertyName и listenerMethodName приведено в разделе the general version of create.- Параметры:
-
target— объект, который выполнит действие -
action— имя свойства или метода (возможно, с уточнением) целевого объекта -
eventPropertyName— имя (возможно, с уточнением) доступного для чтения свойства входящего события -
listenerMethodName— имя метода в интерфейсе прослушивателя, который должен запускать действие - Исключения:
-
NullPointerException— еслиtargetравно null -
NullPointerException— еслиactionравно null - См. также:
Подробное описание методов
getTarget
public Object getTarget()
- Возвращает:
- целевой объект этого обработчика событий
- См. также:
getAction
public String getAction()
- Возвращает:
- действие этого обработчика событий
- См. также:
getEventPropertyName
public String getEventPropertyName()
- Возвращает:
- свойство события
- См. также:
getListenerMethodName
public String getListenerMethodName()
null означает, что действие запускают все методы интерфейса прослушивателя.- Возвращает:
- имя метода, который запустит действие
- См. также:
invoke
public Object invoke(Object proxy, Method method, Object[] arguments)
EventHandler.- Определено в:
-
invokeв интерфейсеInvocationHandler - Параметры:
-
proxy— объект прокси -
method— метод в интерфейсе прослушивателя -
arguments— массив объектов, содержащий значения аргументов, переданных при вызове метода экземпляра прокси, илиnull, если вызванный метод не принимает аргументов. Аргументы примитивных типов обёрнуты в экземпляры соответствующих классов-обёрток, напримерjava.lang.Integerилиjava.lang.Boolean. - Возвращает:
- результат применения действия к целевому объекту
- См. также:
create
public static <T> T create(Class<T> listenerInterface, Object target, String action)
listenerInterface, в которой все методы интерфейса прослушивателя применяют action обработчика к 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(ClassLoader, Class[], 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(ClassLoader, Class[], InvocationHandler) - См. также:
create
public static <T> T create(Class<T> listenerInterface, Object target, String action, String eventPropertyName, String listenerMethodName)
listenerInterface, в которой метод с именем listenerMethodName передаёт значение выражения события, eventPropertyName, последнему методу в инструкции, action, который применяется к target. Все остальные методы прослушивателя ничего не делают. Строка eventPropertyName используется для извлечения значения из входящего объекта события, которое передаётся методу целевого объекта. Обычно метод целевого объекта не принимает аргументов; в этом случае для eventPropertyName следует использовать значение null. Если же требуется передать входящий объект события непосредственно методу целевого объекта, используйте пустую строку. Формат строки eventPropertyName — последовательность методов или свойств, каждый из которых применяется к значению, возвращённому предыдущим методом, начиная с входящего объекта события. Синтаксис: propertyName{.propertyName}*, где propertyName соответствует методу или свойству. Например, чтобы извлечь свойство point из MouseEvent, в качестве eventPropertyName можно использовать "point" или "getPoint". Чтобы извлечь свойство "text" из MouseEvent с источником JLabel, в качестве eventPropertyName можно использовать любое из следующих значений: "source.text", "getSource.text" "getSource.getText" или "source.getText". Если метод не найден или при его вызове возникает исключение, во время обработки события будет выброшено RuntimeException. Например, если входящий объект события равен 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, ничего не делают:
//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(ClassLoader, Class[], InvocationHandler) - См. также:
© 1993, 2025, 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.