Класс EventHandler
- Все реализуемые интерфейсы:
InvocationHandler
public class EventHandler extends Object implements InvocationHandler
EventHandler предоставляет поддержку динамического создания обработчиков событий, методы которых выполняют простое утверждение, вовлекая объект входного события и целевой объект. Класс 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
- См. также:
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
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. |
Подробное описание конструкторов
Обработчик событий
@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(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
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 можно использовать либо "point", либо "getPoint" в качестве eventPropertyName. Для извлечения свойства "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());
}
};
- Type Parameters:
T— тип для создания- Parameters:
-
listenerInterface— интерфейс слушателя для создания прокси -
target— объект, который будет выполнять действие -
action— имя (возможно, с квалификацией) свойства или метода целевого объекта -
eventPropertyName— (возможно, с квалификацией) имя читаемого свойства входящего события -
listenerMethodName— имя метода в интерфейсе слушателя, которое должно инициировать действие - Returns:
- объект, реализующий
listenerInterface - Throws:
-
NullPointerException— еслиlistenerInterfaceравен null -
NullPointerException— еслиtargetравен null -
NullPointerException— еслиactionравен null -
IllegalArgumentException— если создание прокси дляlistenerInterfaceтерпит неудачу из-за ограничений, указанных вProxy.newProxyInstance(java.lang.ClassLoader, java.lang.Class<?>[], java.lang.reflect.InvocationHandler) - See Also:
© 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.
https://download.java.net/java/early_access/jdk24/docs/api/java.desktop/java/beans/EventHandler.html