event是用来抽象事件的,在这里我们将讨论怎么去操纵event,比如说listening,posting,forwarding
Event Listening
有两种方式可以监听事件:Event Hanler and Event Listener。
Listen by use of an Event Handler
我们可以在zk page中将handler指定为一个属性或者在scr中写一个component class
<button onClick="alert('hello world')"></button>
重要的内置变量:
self - 接收event的组件,在这个例子中就是接收onClick事件的button
event - 被接收的时间,在这个例子中就是MouseEvent的实例
它有优点和缺点:
Advantage:
1、改变代码无需重新编译和重新加载应用;
2、如果代码少的话是容易维护的
Disadvantage:
1、运行速度慢;
2、编译错误不能被提前发现;
3、在ui中混杂事务处理代码是难以维护的
Declare an Event Handler in java
我们可以用java代码的方式来实现:
public class MyButton extends Button{
public void onClick(){
Messagebox.show("hello "+event.getName());
}
}
用java代码的方式实现event handler,官方建议是在组件开发时用,因为对开发人员来说,它是隐含的。
Listen by Use of an Event Listener
event listener实现自EventListener
public class MyListener implements EventListener{
@Override
public void onEvent(Event event) throws Exception {
Messagebox.show("hello world");
}
}
btn.addEventListener("onClick",new MyListener());
但是如果组件很多的时候,这样人工一个一个添加Listener是很麻烦的,因此zk提供了一种可以自动根据id连线的方式来监听:
public class MyComposer extends GenericForwardComposer{
private static final long serialVersionUID = -6441175297617827574L;
public void onClick$hi(){
try {
Messagebox.show("hello");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void onClick$bye(){
try {
Messagebox.show("goog bye");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void onOK(){
try {
Messagebox.show("ok pressed");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
然后再页面中,我们可以为window添加apply属性
<?page title="new page title" contentType="text/html;charset=UTF-8"?>
<zk>
<window title="new page title" border="normal" apply="com.jing.zk.MyComposer">
<textbox/>
<button id="hi" label="hi"></button>
<button id="bye" label="bye"></button>
</window>
</zk>
如果要讲Listener延迟,需要同时实现EventListener和Deferrable,当将一个listener延迟后,就算这个监听器已经在页面中注册,但是也不会马上返回服务器,只有当另一个non-deferrable的listener到来时,才回跟随它一起返回,而且是有顺序的。
当我们为page添加listener的情况下,都是延迟的,无论是否实现了deferrable