Класс 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, то любой из методов подходит, и вызов неопределен. По этой причине мы не рекомендуем нацеливаться на перегруженные методы.- C момента:
- 1.4
- См. также:
-
Proxy,EventObject
Конструкторы
| Конструктор и описание |
|---|
EventHandler(Object target,
String action,
String eventPropertyName,
String listenerMethodName) Создает новый объект |
Методы
| Модификатор и тип | Метод и описание |
|---|---|
static <T> T |
create(Class<T> listenerInterface,
Object target,
String action) Создает реализацию |
static <T> T |
create(Class<T> listenerInterface,
Object target,
String action,
String eventPropertyName) /** Создает реализацию |
static <T> T |
create(Class<T> listenerInterface,
Object target,
String action,
String eventPropertyName,
String listenerMethodName) Создаёт реализацию |
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(value={"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 - См. также:
create(Class, Object, String, String)
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 - См. также:
create(Class, Object, String, String, String)
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, можно использовать "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, являются 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 - См. также:
EventHandler
© 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.