Subscribe to EventQueues"
Line 6: | Line 6: | ||
You can subscribe a method (as if in an EventListener) to an [[ZK_Developer's_Reference/Event_Handling/Event_Queues | EventQueue]] by annotate it with <javadoc>org.zkoss.zkmax.ui.select.annotation.Subscribe</javadoc>. For example, | You can subscribe a method (as if in an EventListener) to an [[ZK_Developer's_Reference/Event_Handling/Event_Queues | EventQueue]] by annotate it with <javadoc>org.zkoss.zkmax.ui.select.annotation.Subscribe</javadoc>. For example, | ||
− | <source lang="java"> | + | <source lang="java" high='2, 11'> |
+ | // in receiver composer | ||
@Subscribe("queue1") | @Subscribe("queue1") | ||
public void method1(Event event) { | public void method1(Event event) { | ||
Line 13: | Line 14: | ||
Component target = event.getTarget(); | Component target = event.getTarget(); | ||
} | } | ||
+ | |||
+ | // in sender composer | ||
public void publish() { | public void publish() { | ||
EventQueue<Event> eq = EventQueues.lookup("queue1", EventQueues.DESKTOP, true); | EventQueue<Event> eq = EventQueues.lookup("queue1", EventQueues.DESKTOP, true); | ||
Line 18: | Line 21: | ||
} | } | ||
</source> | </source> | ||
+ | * Notice the queue name should match. | ||
+ | |||
+ | In the example above, when you publish an event in the EventQueue, the subscribed method will be called. This is a useful mechanism to communicate among composers. See also <javadoc>org.zkoss.zk.ui.event.EventQueue</javadoc>. | ||
− | |||
− | |||
==EventQueue Scope== | ==EventQueue Scope== | ||
You can subscribe to EventQueue of different scope. | You can subscribe to EventQueue of different scope. |
Revision as of 02:36, 28 June 2019
Subscribe to EventQueues
- Available for ZK:
You can subscribe a method (as if in an EventListener) to an EventQueue by annotate it with Subscribe. For example,
// in receiver composer
@Subscribe("queue1")
public void method1(Event event) {
// this method will be called when EventQueue "queue1" of Desktop scope is published
Object data = event.getData();
Component target = event.getTarget();
}
// in sender composer
public void publish() {
EventQueue<Event> eq = EventQueues.lookup("queue1", EventQueues.DESKTOP, true);
eq.publish(new Event("onMyEvent", component, data));
}
- Notice the queue name should match.
In the example above, when you publish an event in the EventQueue, the subscribed method will be called. This is a useful mechanism to communicate among composers. See also EventQueue.
EventQueue Scope
You can subscribe to EventQueue of different scope.
@Subscribe(value = "queue2", scope = EventQueues.SESSION)
public void method2(Event event) {
// this method will be called when EventQueue "queue2" of Session scope is published
}
public void publish() {
EventQueue<Event> eq = EventQueues.lookup("queue2", EventQueues.SESSION, true);
eq.publish(new Event("onMyEvent", component, data));
}
Available scopes are: Desktop, Group, Session, Application. Note that Group scope requires ZK EE. See also EventQueues.
Event Name
Since 7.0.3, you can also listen to a specified event name
@Subscribe(value = "queue2", eventName = "event1")
public void method2(Event event) {
// this method will be called when EventQueue "queue2" of Session scope is published
}
public void publish() {
EventQueue<Event> eq = EventQueues.lookup("queue2", EventQueues.DESKTOP, true);
eq.publish(new Event("event1", component, data));
}
Subscriber Method Parameter
The method which subscribes to the EventQueue takes either no parameter, or one parameter of a type Event.
@Subscribe("queue3")
public void method3() { // the event parameter can be omitted
// ...
}
Since 7.0.3, ZK automatically maps event data into the method parameters in order.
@Subscribe("queue3")
public void method3(int i, String s) {
// i will be 100, s will be "eventData"
// ...
}
public void publish() {
EventQueue<Event> eq = EventQueues.lookup("queue3", EventQueues.DESKTOP, true);
eq.publish(new Event("event1", component, new Object[]{100, "eventData"}));
}
If you put the event at the first one, it also works well.
@Subscribe("queue3")
public void method3(Event event, int i, String s) {
// ...
}
To recap, we now have four ways to use a parameter:
- method()
- method(Event event)
- method(Event event, int d1, String d2, ....)
- method(int d1, String d2, ...)
Version History
Version | Date | Content |
---|---|---|
6.0.1 | April 2012 | @Subscribe was introduced. |
7.0.3 | June 2014 | ZK-2076 Enhance Subscribe annotation to map java method by the event name and the parameter type in order |