Класс 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)

Создаёт новый объект EventHandler; обычно вы используете один из методов create вместо прямого вызова этого конструктора.

Методы

Модификатор и тип Метод Описание
static <T> T create​(Class<T> listenerInterface, Object target, String action)

Создаёт реализацию интерфейса listenerInterface, в которой все методы в интерфейсе обработчика применяют обработчик action к target.

static <T> T create​(Class<T> listenerInterface, Object target, String action, String eventPropertyName)

/** Создаёт реализацию интерфейса listenerInterface, в которой все методы передают значение выражения события, eventPropertyName, в заключительный метод в операторном выражении, action, который применяется к target.

static <T> T create​(Class<T> listenerInterface, Object target, String action, String eventPropertyName, String listenerMethodName)

Создаёт реализацию интерфейса listenerInterface, в которой метод с именем listenerMethodName передаёт значение выражения события, eventPropertyName, в заключительный метод в операторном выражении, action, который применяется к target.

String getAction()

Возвращает имя записываемого свойства цели, которое этот обработчик событий установит, или имя метода, который этот обработчик событий вызовет у цели.

String getEventPropertyName()

Возвращает свойство события, которое должно быть использовано в действии, применённом к цели.

String getListenerMethodName()

Возвращает имя метода, который вызовет действие.

Object getTarget()

Возвращает объект, которому этот обработчик событий отправит сообщение.

Object invoke​(Object proxy, Method method, Object[] arguments)

Извлекает соответствующее значение свойства из события и передаёт его действию, связанному с этим EventHandler.

Методы, унаследованные от класса 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

Spec-Zone .ru
спецификации, руководства, описания, API