Spec-Zone.ru › OpenJDK 17

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

Методы, унаследованные от класса 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. Обратитесь к 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());
    }
};
 
Параметры типа:
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, 2021, 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/17/docs/api/java.desktop/java/beans/EventHandler.html

Spec-Zone.ru

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