Spec-Zone.ru › OpenJDK 27

Класс EventHandler

java.lang.Object
java.beans.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
См. также:
  • 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.

Методы, объявленные в классе Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Модификатор и тип Метод Описание
protected Object clone()
Создаёт и возвращает копию этого объекта.
boolean equals(Object obj)
Указывает, равен ли другой объект этому объекту.
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(long timeoutMillis)
Переводит текущий поток в состояние ожидания до пробуждения, обычно вследствие вызова notify или interrupt, либо до истечения заданного интервала реального времени.
final void wait(long timeoutMillis, int nanos)
Переводит текущий поток в состояние ожидания до пробуждения, обычно вследствие вызова 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
См. также:
  • 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, в которой все методы интерфейса прослушивателя применяют 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(Class, Object, String, String)
  • 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(Class, Object, String, String, String)
  • 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)
См. также:
  • EventHandler
  • Proxy.newProxyInstance(ClassLoader, Class[], InvocationHandler)

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и рабочие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её дочерних компаний в США и других странах.
Авторские права © 1993, 2026, Oracle и/или её дочерние компании, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API