zk中zul页面中组件的id和java类中的变量绑定实现

xiaoxiao2026-08-20  13

zul 页面 index.zul
<?xml version="1.0" encoding="UTF-8"?> <zk> <window title="zk使用apply属性关联后台Java类" border="normal" apply="com.civcse.main.MainLayoutComposer" width="300px"> <vbox> <label id="resultLab" value="默认值" /> <textbox id="inputTextbox" /> <button id="runButton" label="运行" /> </vbox> </window> </zk>

 

在window组件里面使用apply属性关联到后台java类。

方法1:继承 GenericForwardComposer 抽象类
package com.civcse.main; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.util.GenericForwardComposer; import org.zkoss.zul.Label; import org.zkoss.zul.Textbox; public class MainLayoutComposer extends GenericForwardComposer { /** * zul组件对象映射 */ private Label resultLab; private Textbox inputTextbox; /* * (non-Javadoc) * * @see org.zkoss.zk.ui.util.GenericForwardComposer#doAfterCompose(org.zkoss.zk.ui.Component) */ public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); // 必须的,作用:变量和页面中zk组件绑定进行初始化变量 System.out.println("渲染后执行自定义初始化"); } /** * onClick$runButton * onClick=事件名称 * runButton=对应的Component id * $必须的! */ public void onClick$runButton() { System.out.println("button click 事件"); if (!inputTextbox.getText().trim().equals("")) { resultLab.setValue(inputTextbox.getText()); } } }
 

创建过程:1 新建类 MainLayoutComposer 继承 抽象类GenericForwardComposer;                2 手动添加方法public void doAfterCompose(Component comp) throws Exception {},重写抽象类中的方法;                3 在doAfterCompose(Componet comp)方法中必须使用super.doAfterCompose(comp); 初始化和zul页面组件关联的属性。说明:1  把变量绑定到zk组件,变量名必须和zk组件id同名;               2  事件绑定格式"事件$zk组件id" 例如onClick$runButton onClick=事件名称, runButton=对应的Component id  $必须的!

方法2:实现接口org.zkoss.zk.ui.util.Composer
package com.cvicse.main; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Components; import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.util.Composer; import org.zkoss.zul.Label; import org.zkoss.zul.Textbox; public class MyComposer implements Composer { /** * zul组件对象映射 */ private Label resultLab; private Textbox inputTextbox; /* * (non-Javadoc) * * @see org.zkoss.zk.ui.util.Composer#doAfterCompose(org.zkoss.zk.ui.Component) */ public void doAfterCompose(Component arg0) throws Exception { System.out.println("init........."); init(arg0); } /** 固定写法,必须有的 * @param component */ public void init(Component component) { // 将当前对象的变量和参数对象进行绑定 Components.wireVariables(component, this); // 转发一个当前的事件方法到所对应名称的Component() Components.addForwards(component, this); // 注册一个监听到当前的对象 Events.addEventListeners(component, this); } /** * onClick$runButton * onClick=事件名称 * runButton=对应的Component id * $必须的! */ public void onClick$runButton() { System.out.println("button点击了"); if (!inputTextbox.getText().trim().equals("")) { resultLab.setValue(inputTextbox.getText()); } }

 

说明:1 使用org.zkoss.zk.ui.util.Composer接口可以在方法doAfterCompose(Component arg0)执行渲染后的初始化;           2 init(Component component) 固定写法详细解释请看代码里的注释。init方法使button按钮发生点击事件能够执行onClick$runButton() 方法,实现了zk组件id和变量的绑定。

总结:

           1.  MyComposer extends GenericForwardComposer || GenericAutowireComposer然后再doAfterCompose调用父类的doAfterCompose方法,这样就不用去写init方法了!

            2. zkdemo 3.5.2使用的是这种方式, zk交流论坛中都是使用方法1,如果类A要继承类B就可以考虑import Composer接口来实现数据绑定功能。

转载请注明原文地址: https://www.6miu.com/read-5051556.html

最新回复(0)