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

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接口来实现数据绑定功能。

你可能感兴趣的:(java,xml,UI,zk)