收藏 分享(赏)

ZK 学习教程.doc

上传人:wspkg9802 文档编号:6855179 上传时间:2019-04-24 格式:DOC 页数:93 大小:2.82MB
下载 相关 举报
ZK 学习教程.doc_第1页
第1页 / 共93页
ZK 学习教程.doc_第2页
第2页 / 共93页
ZK 学习教程.doc_第3页
第3页 / 共93页
ZK 学习教程.doc_第4页
第4页 / 共93页
ZK 学习教程.doc_第5页
第5页 / 共93页
点击查看更多>>
资源描述

1、ZK 学习总结(1)2011-09-20目 录1 了解 ZK .11.1 理解 ZK .11.2 ZK 特点 .12 ZK 环境搭建 .32.1 安装环境前,需要下载的东西: 32.2 安装过程 32.3 第一个用 Eclipse 创建的 ZK 项目:Hello World 72.4 例子中的配置分析 .123 组件基础属性及事件 .153.1 ID 属性 153.2 IF 和 unless 属性 .163.3 use 和 apply 属性 .163.4 forEach 属性 .203.5 事件处理 .204 组件属性及重要函数 .284.1 标签组件 .284.2 按钮组件 .304.3 日

2、历组件 .314.4 图像组件 .324.5 窗口 .344.6 布局组件 .394.7 标签页 .444.8 网格 .484.9 菜单 .564.10 列表框 594.11 树形组件 645 应用示例 .715.1 功能简介 .715.2 建立项目环境 .715.3 登陆功能 .725.4 权限判断 .735.5 页面布局实现 .745.6 权限管理实现 .755.7 信息中心模块 .775.8 示例配置代码 .79第 1 页 1 了解 ZK1.1 理解 ZKZK 官方网站及中有关于 ZK 的定义:“ZK 是一个事件驱动(event-driven)的,基于组件(component-based

3、)的,用以丰富网络程序中用户界面的框架。ZK 包括一个基于 AJAX 事件驱动的引擎(engine),一套丰富的 XUL 和 XHTML,以及一种被称为ZUML(ZK User Interface Markup Language,ZK 用户界面标记语言)的标记语言” 。通过这么一段时间的接触,体验到 ZK 是 C/S 构架在 WEB 应用中的实现。写过 C/S 程序的同学应该能够理解 C/S 构架特点,如 C+,.NET 等语言的应用程序构架,以上语言在编写C/S 构架程序的时候都是基于各个组件的应用,如窗口、按钮、列表等,用面向对象的语言来说,C/S 程序是由各个可视化的对象组成的。最简单的

4、程序需要有以下几个步骤,第一,编写前台数据输入页面,然后编写后台处理数据的代码,最后编写数据处理的结果的页面。以上的3个步骤在 B/S 框架中通常是独立分开的,而目前 ZK 框架则将三者能够绑定在一起,在一个 ZK 得页面中完成。像桌面程序一样,每个显示页面关联一个后台程序,页面中元素值及属性在后台程序中均能够随时得到,后台程序也能够控制页面元素。ZK 是基于组件的,每个组件都有对应的 HTML 页面显示,又会对应一个 JAVA 对象。于是用户可以通过后台程序中对组件 JAVA 对象的处理来更新页面的 HTML 显示,而页面中元素的从属关系则体现在 Java 中的 List 类,每个组件都能够

5、获得属于其中的元素列表(List)。1.2 ZK 特点通过这么一小段时间的 ZK 学习与应用,总结一点我认为特点与体会。1.组件多样,能够轻松完成普通 web 程序很难完成的树、图表、页面局部动态变换、标签页、分页网格等功能,是实现富客户端应用的良好工具。2.开发模式简单,只需要掌握各个组件应用变可以轻松完成应用开发。但利用 ZK 开发还有些缺点的地方1.学习资料较少,只有官方网站中的例子,且例子均是局部功能,没有完整的 WEB 项第 2 页 目参考。这样就不能了解类包及页面如何分配等相关知识,如目前比较缺少在 ZK 中通用的对数据库进行增删改查的例子,打开2个 window 间数据传递等功能

6、。2.感觉网格不是很好用,网格中的一行可以显示一条数据,但如何通过一行直接获得绑定的数据?还是事件处理部分,事件处理是一个组件的特定函数,即一个类的函数,而函数中处理数据经常需要其他组件的数据,如何获得其他组件数据?唯一的方法似乎是事件监听类为组件的内部类。3.版本问题,目前 ZK 最新式5.0,其中官网中的 DEMO 均是此版本的,而其他的 DEMO及 Eclipse 的插件均是3.6版本的 ZK,导致从例子中学习的一些程序代码在其他环境中运行出错。4.编译源码问题,由于功能需要,需要对项目源代码进行重新编译,但 ZK 的编译需要在 Linux 或模拟 Linux 环境下运行,不是很方便,目

7、前还没掌握。第 3 页 2 ZK 环境搭建2.1 安装环境前,需要下载的东西:作为一个基于 java 的 web framework,再使用 ZK 之前,需要成功安装 JDK 和 tomcat5.5 或者更高的版本,所以要提前下载的东西为:下载 JDK(Java SE )安装包;下载 Tomcat 安装包;下载 Eclipse IDE 软件开发工具安装包,我们项目组目前 Eclipse 环境为 3.4;下载 ZK Library;下载 ZK Studio对于 ZK Library 可以再 http:/www.zkoss.org/download/zk.dsp 下载,ZK Studio 插件可以

8、在 http:/www.zkoss.org/product/zkstudio.dsp 下载。2.2 安装过程2.2.1 安装 Java 运行环境Java 运行环境(Jre )是运行 ZK 的基础,也是运行 servelet 容器必需的。Jre 可以登录SUN 的官方网站(http:/ )中下载到本地机器。安装之后需要配置环境变量。2.2.2 安装 Servlet 容器Apache Tomcat 是当前广为流行的 Servlet 容器之一,安装简单,使用方便,可以使用官方网站提供的两种安装方法。第一种使用 Installer 包安装,第二种是快速安装方法,是Tomcat 提供的一个.ZIP 文件

9、。第二种具体操作过程是:首先,可已访问官方网站下载.zip文件;其次,将文件解压到本地机器;然后装 tomcat,装完后启动 tomcat 测试是否可以正常运行,以便查看环境变量测试的是否正确(默认端口是 8080)。在地址栏直接键入http:/localhost:8080/或者输入 http:/127.0.0.1:8080。第 4 页 2.2.3 安装 Eclipse 可以到 www.eclipse.org 下载 eclipse,可以选择: Download now 下载完成后,只需要将下载的压缩文件 eclipse-SDK-3.4-in32.zip 解压到指定位置,例如 D:Eclipse

10、 即可完成安装。记下来就可以。安装后,会弹出一个画面选择工作空间,自己指定一个就可以。2.2.4 安装插件通过自己在 Eclipse 下安装 ZK 插件的学习体会,总结了在 Eclipse 下安装插件主要有三种方式,我认为第三种方式比较好(推荐) ,具体的安装过程如下:第一种方法:主要借助于 Eclipse 的向导来安装插件。通过 Help/Software Updates/Find and Install,在弹出的菜单中选择“Search for new features to install”,点“Next ”,在下一菜单中选择“New Local Site”或“New Archived

11、Site” ,找到你下载的插件所在目录,选中安装即可。 第二种方法:在 Eclipse 的主目录(%ECLIPSE_HOME%)下有一个 plugins 目录和features 目录。将插件解压缩后,在解压缩后的文件夹里一般可以看到 plugins 文件夹,有的插件解压缩后还可以看到一个 features 文件夹。一般将 plugins 文件夹下的内容直接拷贝到%ECLIPSE_HOME%plugins 目录下,如果解压缩后的插件目录下还有 features 文件夹,则把该文件夹下的内容也拷贝到%ECLIPSE_HOME%features 下。重新启动 Eclipse 之后就可以使用刚刚安装的

12、插件了。第三种方式:就是在 Eclipse 主目录下创建一个 links 目录,然后将你自己的插件放在你想放的任何地方,这个时候你放插件的目录就是插件目录(%PLUGIN_HOME% ) ,然后在你的%ECLIPSE_HOME%links目录下创建一个 link 文件,比如要安装一个 Lomboz 插件,可以在 links 目录下创建一个 Lomboz.eclipse.link 文件, link 文件的名称随便取。这个Lomboz.eclipse.link 文件指向的存放 Lomboz 插件的目录(%PLUGIN_HOME% ) 。假如你的Lomboz 插件的 zip/rar 文件解压缩后放在

13、 C:eclipse_pluginsLomboz.eclipse 下(如果是插件是 jar 文件则可以不用解压缩) ,则 Lomboz.eclipse.link 文件的内容就应该是:path=C:eclipse_pluginsLomboz.eclipse。注意:path 所指的文件路径一定要增加一个“”转义符来分开。第 5 页 其余插件的安装也是如此,比如安装 Eclipse 多国语言包,通过安装 Eclipse 多国语言包,Eclipse 可以自动实现开发环境的本地化,即自动根据操作系统的语言环境选择语言包进行本地化,先到 http:/download.eclipse.org/eclipse

14、/downloads/下载 Eclipse3.2 版本的多国语言包,其名称为 Language pack。按照前面的第三种方式安装即可。2.2.5 配置 ZK 环境(ZK 库)1.打开 Eclipse(前提条件是已经安装好了 ZK studio 插件),如果没有安装,请先按照前面的介绍安装插件;2.点击菜单 Window-Preferences(From menu goto Windows Preferences );3.在打开的这个窗口上选择 ZK-ZK Packages(On the Preferences Window, select ZK ZK Packages);4.点击 Add D

15、iretory 选择到你下载的 ZK Library 包,不用解压,直接是 ZIP 文件,如下图:5.会跳出一个窗口来,点击 OK第 6 页 6.给这个包命名,一般就用默认的,点击 OK;7.再选择上那个 ZK Library 就行了,如果你不选择,会自动选择最后你引入的版本的。到此,ZK 的环境就配置完了。第 7 页 2.3 第一个用 Eclipse 创建的 ZK 项目:Hello World2.3.1 创建项目过程1.启动 Eclipse,我倾向于在 Java EE 下创建项目2.如果没有建立 Server 的话,需要先打开 Window-show view - other-servers

16、 右击选择 New -Server,然后选择 tomcat 即可; 第 8 页 3.选择 File-New-Dynamic Web Project,输入项目名称,例如我给项目其名字为第 9 页 MyZK; 4.点 Next,再点 Finish 就完成了一个 ZK 项目的创建;第 10 页 5.右击项目名称,选择 properties-Java BuidPath 给项目导入 ZK 的 Jar 包,将%ZK_HOME%distlib 目录下的所有 jar 文件(如果需要更多 ZK 附加功能,加入 ext 与zkforge 目录下的 jar 文件)到 WebContentWEB-INFlib 目录下

17、。6.创建一个新的 ZUL 文件(Creating a new ZUL file):helloworld;7.创建完.zul 文件后,写入 ZK 代码;第 11 页 8.启动 Tomcat 服务器,选择 MyZK,运行;9.在浏览器里输入:http:/localhost:8080/MyZK/first.zul,就可以看到下面的内容。第 12 页 2.4 例子中的配置分析2.4.1 项目目录结构在 Eclipse 下搭建的 ZK 环境上开发的程序,比如对于上面的例子项目 MyZK,其目录结构如下所示:下面对于上面的目录中的文件,我通过查找资料,进行了总结,对于 Zk 的配置文件大体的意思是:WE

18、B-INF/web.xml 定义了必须的 servlet,及运行 ZK 应用程序所需要的监听器;WEB-INF/zk.xml 为 ZK 的配置描述文件;WEB-INF/lib 包括了 ZK 的必须库文件;该应用程序所需的重要 jar 包文件说明:. bsh.jar: BeanShell Java 代码解释器. commons-el.jar: Apache 的 EL 表达式解释器. zcommon.jar : ZK 的通用库. zhtml.jar: XHTML 相关组件. zk.jar : ZK 核心代码. zkplus.jar :与 Acegi Security, Spring, Hibern

19、ate,和 data binding 集成的代码第 13 页 . zul.jar :XML 相关组件. zweb.jar:web 相关功能代码2.4.2 关于 web.xml 的配置在 web.xml 中为 ZK 定义必须的 servlet ,及 listener,我把在该项目 MyZK 下的web.xml 文件中的代码拷贝如下:MyZKUsed to cleanup when a session is destroyedZK Session cleanerorg.zkoss.zk.ui.http.HttpSessionListenerThe ZK loader for ZUML pagesz

20、kLoaderorg.zkoss.zk.ui.http.DHtmlLayoutServletupdate-uri/zkau1The asynchronous update engine for ZKauEngineorg.zkoss.zk.au.http.DHtmlUpdateServlet第 14 页 LoginServletLoginServletservlet.LoginServletzkLoader*.zulzkLoader*.zhtmlauEngine/zkau/*LoginServlet/userloginindex.htmlindex.htmindex.jspdefault.ht

21、mldefault.htmdefault.jspindex.zul2.4.3 关于 zk.xml 的配置.xml 文件是对 ZK 配置的描述性文件,我把在该项目 MyZK 下的 zk.xml 文件中的代码拷贝如下:第 15 页 ajax/timeout.zul3 组件基础属性及事件3.1 ID 属性为了读取 Java 代码或 EL 表达式中的组件,我们可以使用 id 属性来标识它。在下面的例子中,我们为 label 设置了一个标识,这样当一个按钮被按下时,我们就可以操纵label 的值了。如下面两个例子可以让你领会 id 的作用Do you like ZK?当按下“Yes”按钮的时候,可以看到

22、如下效果。id 属性在 EL 表达式中的应用,如下代码:这段代码实现的是将文本框中的值赋给标签, “source”就代表着文本框,我们只需对其进行操作就相当于对文本框操作了。第 16 页 3.2 IF 和 unless 属性if 和 unless 属性被用于控制是否创建一个组件,在下面的例子中,两个 label 只有在请求中含有一个为 vote 的属性时才被创建:如果两个属性都被指定,将不会创建组件除非它们的值都被赋值为 true。3.3 use 和 apply 属性在页面中嵌入代码不当会增加维护的难度,有两种途径可以从视图中分离出代码。一种途径是你可以监听所关心的事件,然后调用合适的方法进行

23、处理。例如,可以调用onCreate, onOK, onCancel 事件来完成初始化(initialize),处理(process)和取消(cancel)等工作。另外,必须有一个名称为 MyManager 的 Java 类,内容像下面一样:import org.zkoss.zul.Messagebox;import org.zkoss.zul.Window;public class MyManager public static void init(Window main) main.setTitle(“关注我的请求!“);public static void save(Window mai

24、n) throws InterruptedException main.setTitle(“save“);Messagebox.show(“您的信息已经保存!“);public static void cancel(Window main) throws InterruptedException main.setTitle(“cancel“);Messagebox.show(“你取消的请求已经完成!“);第 17 页 按下“save ”按钮的时候,程序运行的效果如下:但是,上面的方法需要你在 ZUML 页面内嵌入一些代码。在用户界面(UI)内嵌入代码的优点是可以很容易的动态改变行为(特别是在原

25、型阶段),但是这仍然会展现一些维护代码且性能会有一些降低。于是引出了 use 和 apply 属性的使用。3.3.1 use 属性若不想在 ZUML 页面内使用 Java 代码,你可以继承一个组件的实现来处理事件,如下。import org.zkoss.zul.Messagebox;import org.zkoss.zul.Window;public class MyWindow extends Window public void onCreate() this.setTitle(“关注我的变化!“);public void onSave() this.setTitle(“save“);pu

26、blic void onCancel() this.setTitle(“cancel“);然后,使用 use 属性指定类,如下。执行效果如下:第 18 页 3.3.2 apply 属性若你喜欢使用 MVC(模型-试图-控制者)方法,例如,你不想在 window(视图)内嵌入处理代码,可以实现一个类来初始化 window。这个类必须实现org.zkoss.zk.ui.util.Composer 接口。import org.zkoss.zk.ui.Component;import org.zkoss.zk.ui.util.Composer;import org.zkoss.zul.Window;p

27、ublic class MyComposer implements Composer public void doAfterCompose(Component comp) throws Exception (Window) comp).setTitle(“Apply can be used as this!“); / do whatever initialization you want在这里我们假设你有三个监听器, MyCreate,MyOK,和 MyCancel。参考下面的事件章节获取事件监听器的解释。然后,使用 apply 属性指定类,如下。按下 apply 按钮,程序执行效果如下:第

28、19 页 window 仍然作为 org.zkoss.zul.Window 的一个实例被创建,且作为 comp 参数被传递给 doAfterCompose 方法。然后,你可以处理你所希望的初始化。若你想 apply 多个composer,使用逗号隔开。另外,你可以使用 EL 表达式来返回类,它的名称,Composer 实例,或 Composer 实例的集合。示意的代码如下:3.3.3 与 forward 属性一起使用window 通常由一些按钮,菜单项目和其他组件组成。例如,当用户点击按钮时,onClick 事件会被送至按钮本身。但是这些事件最好在 window 内处理而不是散落这些按钮。为了

29、这样,你可以按如下方式使用 forward 属性。.在这里 OK 按钮的 forward 属性指定接收 onClick 事件后将其作为 onOK 事件转向空间所有者(例如,window)。同样,针对 Cancel 按钮的 onClick 事件会转向 onCancel 事件。因此你可以在 MyWindow 命名空间内处理 onOK 和 onCancel 事件,如下。public class MyWindow extends Window public void onOK() /called when the OK button is clicked (or the ENTER buttonis

30、pressed)public void onCancel() 第 20 页 /called when the Cancel button is clicked (or the ESC buttonis pressed)除了将 onClick 事件 forward 至空间所有者,你可以使用 forward 属性将任何事件forward 至任何组件。3.4 forEach 属性forEach 属性用来控制要创建多少个组件,如果你为这个对象指定一个对象集合,ZK 装载机(ZK loader)将为每个被指定的集合项目创建一个组件。在下面的 ZUML 页面中,listitem 元素将被赋值三次(分别为“

31、Monday“, “Tuesday“ 和“Wednesday“),然后产生三个 list 项目。contacts = new String “Monday“, “Tuesday“, “Wednesday“, “Thursday“,“Friday“, “Saturday“, “Sunday“ ;代码运行的效果如下:除了使用 foreach,还可以通过 forEachBegin 和 forEachEnd 来控制迭代(iteration)。3.5 事件处理事件(org.zkoss.zk.ui.event.Event)用来通知服务器发生了什么。每种类型的事件都由一种不同的类来表示。例如,org.zko

32、ss.zk.ui.event.MouseEvent 来代表鼠标活动,如点击。为了响应事件,服务器需要为其注册一个或多个事件监听器。由两种方法来注册一第 21 页 个事件监听器。一种是通过在标记语言中指定onXxx 属性。另一种方法是为你要监听的组件或页面调用addEventListener 方法。除了在浏览器端由客户活动触发的事件,一个应用程序可以使用org.zkoss.zk.ui.event.Events 类中的sendEvent 和postEvent 方法来触发事件。3.5.1 桌面和事件处理如上所述,桌面是页面的集合,这些页面服务于同样的URL 请求。一个桌面当然是事件监听器能读取的范围

33、。当一个事件被触发时,它就和桌面联系在一起。ZK 分离基于关联桌面及流水事件(pipelines events)分成单独的队列。因此,同一桌面的事件可以被顺序处理。另一方面,不同桌面的事件可以被并行处理。一个事件监听器是被允许读取事件关联桌面内任何页面的任何组件的。它也被允许将一个组件从一个页面移到另一个页面,只要这些页面在同一桌面内。另一方面,它不能读取到其它桌面的组件。注: 开发人员可以在一个事件监听器中将一个组件从一个桌面卸载,然后在另外的事件监听器中将其添加到另外一个桌面。3.5.1.1 桌面及创建组件当一个组件在一个事件监听器中被创建时,它就自动被分配到被处理的事件相关联的桌面。即使

34、组件不属于一个页面这种分配也会发生。这就意味着你在事件监听器中创建的任何组件可以用于监听正在处理的同一桌面。如果一个组件是在一个线程(thread)而不是任何事件监听器中创建的话,它就不属于任何桌面。在这种情况下,可以将它添加到任何一个桌面,只要添加发生在一个合适的监听程序中。当然,一旦组件被添加到一个桌面,它就一直属于这个桌面。对于大多数应用程序而言,很少在线程(thread)而不是事件监听器中创建组件。然而,如果有一个长操作(long operation),你或许会在后台线程(background thread)中执行它。那么,你可以在后台准备一些组件树,然后在合适的事件被接收时将它们添加

35、到桌面。关于此的详细信息,参看事件监听与处理一节的详细介绍。3.5.2 事件监听与处理3.5.2.1 通过标记语言添加事件监听器添加一个事件监听器最简单的方法就是在一个ZUML 页面内声明一个属性。用来监听的属性的值是可以被BeanShell 解释的任何Java 代码。第 22 页 点击“say welcome”按钮,效果如下图所示:3.5.2.2 通过程序添加或移除事件监听器有两种方法通过程序添加或移除事件监听器。第一种 声明一个成员当用你自己的类重定义(overriding)一个组件后,你可以声明一个成员函数成为事件监听器。在一个ZUML页面中,你可以使用use属性来指定你想使用的类,即用

36、它去替换默认类。如下所示,它使用了MyWindow来替换默认的org.zkoss.zul.Window。然后你淂实现MyWindow.java 同过继承默认的类,就像下面一样:public class MyWindow extends org.zkoss.zul.Window public void onOK() /add an event listener./handles the onOK event (sent when ENTER is pressed)如果你想获得关于事件的更多信息,你可以按如下方式声明:public void onOK(org.zkoss.zk.ui.event.K

37、eyEvent event) .不同的事件或许与不同的事件对象相关联。第二种 动态地添加与移除事件监听器开发人员可以使用org.zkoss.zk.ui.Component 接口中的addEventListene 和removeEventListener 方法来动态地添加或移除事件监听器。如下所示,动态添加的事件监第 23 页 听器必须实现org.zkoss.zk.ui.event.EventListener 接口。void init(Component comp) .comp.addEventListener(“onClick“, new MyListener();.class MyListe

38、ner implements org.zkoss.zk.ui.event.EventListenerpublic void onEvent(Event event) throws UiException ./processing the event(1) 延期事件监听器默认情况下,当客户端的事件被触发时就会被送到服务器。但是,许多事件仅用于维持服务器端的现状,而不是向客户端提供视觉响应(visual response)。换句话说,这些监听器的事件并不需要马上被送出。相反,它们应该仅被提交一次,以降低客户端和服务器端的来往,以提高服务器的性能。为求描述方便,我们称它们为延期事件监听器(Defer

39、rable Event Listeners)。为了使一个事件监听延期,必须实现org.zkoss.zk.ui.event.Deferrable接口(和 EventListener)并且使用isDeferrable 方法返回true,就像下面一样。public class DeferrableListener implements EventListener,Deferrable private boolean _modified;public void onEvent(Event event) _modified = true;public boolean isDeferrable() ret

40、urn true;当客户端的一个事件(例如,选择一个列表项目(list item)被触发时,如果没有为其注册事件监听器或仅有延期(deferrable)的监听器被注册,ZK 不会将事件送出。一方面,如果至少有一个非延期(non-deferrable)监听器,事件会被马上送到服务器端,和所有的队列事件(queued events)一起。没有事件会丢失,到达顺序是保存好的。提示:当有非延期监听器为用户提供视觉响应,可以使用使用延期的(deferrable)事件监听器维持(maintaining)服务器状态。(2) 为页面动态地添加和移除事件监听器第 24 页 开发人员可以为页面(org.zkoss

41、.zk.ui.Page)动态地添加和移除事件监听器。一旦被添加,所有被指定名字的事件会被送到指定页面的任何组件,这些页面将会被送到监听器。所有的页面级(page-level)事件监听器都是非即时。换言之,isArap 方法被忽略了。一个典型的例子是使用页面级事件监听器来维护修改标志(modification flag),如下:import org.zkoss.web.servlet.dsp.action.Page;import org.zkoss.zk.ui.event.Deferrable;import org.zkoss.zk.ui.event.Event;import org.zkoss

42、.zk.ui.event.EventListener;import org.zkoss.zul.Window;import org.zkoss.zk.ui.*;public class ModificationListener implements EventListener, Deferrable private final Window _owner;private final Page _page;private boolean _modified;public ModificationListener(Window owner) / Note: we have to remember

43、the page because unregister might/ be called after the owner is detached_owner = owner;_page = (Page) owner.getPage();(org.zkoss.zk.ui.Page) _page).addEventListener(“onChange“, this);(org.zkoss.zk.ui.Page) _page).addEventListener(“onSelect“, this);(org.zkoss.zk.ui.Page) _page).addEventListener(“onCh

44、eck“, this);/* Called to unregister the event listener.*/public void unregister() (org.zkoss.zk.ui.Page) _page).removeEventListener(“onChange“, this);(org.zkoss.zk.ui.Page) _page).removeEventListener(“onSelect“, this);(org.zkoss.zk.ui.Page) _page).removeEventListener(“onCheck“, this);第 25 页 /* Retur

45、ns whether the modified flag is set.*/public boolean isModified() return _modified;public void onEvent(Event event) throws Exception public boolean isDeferrable() return false;3.5.2.3 调用顺序调用事件监听器的顺序如下。假定接收的是onClick 事件。1. 如果监听器实现了org.zkoss.zk.ui.event.Express 接口,依次为添加到目标组件(targeting component)的onClic

46、k 事件调用事件监听器。按照添加的顺序调用。2. 调用目标组件的onClick 属性指定的脚本语言。3. 如果监听器没有实现org.zkoss.zk.ui.event.Express 接口,依次为添加到目标组件的onClick 事件调用事件监听器。按照添加的顺序调用。4. 调用目标组件的onClick 成员方法。5. 依次为添加到目标组件所属页面的的onClick 事件调用事件监听器。按照添加的顺序调用。org.zkoss.zk.ui.event.Express 接口是一个装饰器(decorative interface),用来改变调用事件监听器的优先级。注意,如果事件监听器被添加到页面,而不

47、是组件,这个接口是没有意义的。3.5.2.4事例:一个异步产生标签的工作线程package Test;import org.zkoss.lang.Threads;import org.zkoss.zk.ui.Desktop;import org.zkoss.zk.ui.Executions;import org.zkoss.zul.Label;public class WorkingThread extends Thread private static int _cnt;第 26 页 private Desktop _desktop;private Label _label;private

48、final Object _mutex = new Integer(0);/* Called by thread.zul to create a label asynchronously. To create a label,* it start a thread, and wait for its completion.*/public static final Label asyncCreate(Desktop desktop)throws InterruptedException final WorkingThread worker = new WorkingThread(desktop

49、);synchronized (worker._mutex) / to avoid racingworker.start();Executions.wait(worker._mutex);return worker._label;public WorkingThread(Desktop desktop) _desktop = desktop;public void run() _label = new Label(“Execute “ + +_cnt);synchronized (_mutex) / to avoid racingExecutions.notify(_desktop, _mutex);然后,在一个事件监听器中,我们使用ZUML 页面来调用这个工作线程,如在onClick事件中。使用的代码如下所示:timer.start();Label label = Test.WorkingThread.asyncCreate(desktop);main.appendChi

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报