Класс 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. |
Подробное описание конструкторов
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.
https://docs.oracle.com/en/java/javase/25/docs/api/java.desktop/java/beans/EventHandler.html