package org.zkoss.support.forum; import org.zkoss.zk.ui.Desktop; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.EventQueue; import org.zkoss.zk.ui.event.EventQueues; import org.zkoss.zk.ui.select.SelectorComposer; import org.zkoss.zk.ui.select.annotation.Listen; import org.zkoss.zk.ui.select.annotation.Wire; import org.zkoss.zk.ui.select.annotation.WireVariable; import org.zkoss.zk.ui.sys.DesktopCtrl; import org.zkoss.zul.Label; import org.zkoss.zul.Vbox; import org.zkoss.zul.Window; /** * @author Vincent * */ public class EventQueueSampleComposer extends SelectorComposer { private static final long serialVersionUID = -3344321079575322219L; @WireVariable private Desktop desktop; @Wire private Vbox inf; @Listen("onClick = #startLongOp") public void doClick() { if (EventQueues.exists("longop")) { print("It is busy. Please wait"); return; // busy } ((DesktopCtrl) desktop).enableServerPush(new org.zkoss.zk.ui.impl.PollingServerPush(2000, 5000, -1)); final EventQueue eq = EventQueues.lookup("longop"); final EventListener longOp = new EventListener() { public void onEvent(Event evt) { if ("doLongOp".equals(evt.getName())) { org.zkoss.lang.Threads.sleep(3000); String result = "success"; eq.publish(new Event("endLongOp", null, result)); } } }; final EventListener callback = new EventListener() { public void onEvent(Event evt) { if ("endLongOp".equals(evt.getName())) { print((String) evt.getData()); EventQueues.remove("longop"); } } }; eq.subscribe(longOp, callback); print("Wait for 3 seconds"); eq.publish(new Event("doLongOp")); } private void print(String msg) { new Label(msg).setParent(inf); } }