Spec-Zone.ru › OpenJDK 21

Класс EventHandler

java.lang.Object
java.beans.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)
Извлечь соответствующее значение свойства из события и передать его в действие, связанное с этим обработчиком событий.

Методы, объявленные в классе 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, в которой все методы в интерфейсе слушателя применяют action обработчика к target. Этот метод реализуется путём вызова другого, более общего, метода create с обоими eventPropertyName и listenerMethodName принимающими значение null. Обратитесь к the general version of create для полного описания параметра action.

Чтобы создать 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. Обратитесь к the general version of create для полного описания action и eventPropertyName параметров.

Чтобы создать 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". Если метод не найден или при вызове метода возникает исключение, во время диспетчеризации будет выброшено исключение 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:
  • EventHandler
  • Proxy.newProxyInstance(java.lang.ClassLoader, java.lang.Class<?>[], java.lang.reflect.InvocationHandler)

© 1993, 2023, 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/21/docs/api/java.desktop/java/beans/EventHandler.html

Spec-Zone.ru

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