Spec-Zone.ru › OpenJDK 25

Класс EventHandler

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

Подробное описание конструкторов

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, 2025, 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.
https://docs.oracle.com/en/java/javase/25/docs/api/java.desktop/java/beans/EventHandler.html

Spec-Zone.ru

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