本帖最后由 xvvvx 于 2013-01-30 23:12:01 编辑

解决方案 »

  1.   

    <button label="查詢" onClick="@command('Query')"/>
         <tabbox id="tb" height="600px">
    <tabs id="tabs">
    <tab id="test01" label="資訊"/>
    <tab id="test02" label="test"/>
    </tabs>
    <tabpanels>
    <tabpanel><include src="/mvc/test01Info/test01Info.zul"/></tabpanel>
    <tabpanel><include src="/mvc/test0202Info/test02Info.zul"/></tabpanel>
    </tabpanels>
    </tabbox>目前在Query方法里我把整个页面跳转回本页面,两个include进来的window才有值,我想实现不要跳转本页面,只刷新这个tabbox组件,有没有办法实现,各位帮帮忙啊
      

  2.   

    ZK后台你可以直接操作tabbox的。
    在你的点击按钮事件中:
    //获得tabbox对象
    Tabbox tb = self.getFellowIfAny("tabbox");
    //对tabbox进行操作
      

  3.   

    ZK是基于AJAX的,所有的操作都可以异步刷新。
    后台对象操作,均可在页面中体现出。
      

  4.   

    就是卡在對tabbox刷新的操作上,請問應該怎麼写,Thanks!
      

  5.   

    ZK是我几个月前做的,现在大致看代码告诉你吧:
    我这里用的是apply
    <window id="payApplyPlanMgrWin" width="100%" 
    border="0" position="center,top" height="100%" apply="${testMgrController}">
    <Tabbox id="yourtabbox">
    </Tabbox>
    <toolbarbutton label="测试" onClick="controller.myTest(self)"></toolbarbutton>
    在你的TestMgrController类中,定义yourtabbox对象
    然后在你的按钮单击事件myTest中就可以操作yourtabbox了,
    yourtabbox应该有很多属性的,如:
    //获得子对象集合
    List<org.zkoss.zk.ui.Component> list = yourtabbox.getChildren();
    //设置式样
    yourtabbox.setStyle等等。
    直接对yourtabbox这个对象操作即可。
      

  6.   

    总的来说就一句话,ZK页面的对象和你后台对象可以一一对应,
    你对后台对象的操作,都可以体现到页面上。感觉ZK做一些ERP类的应用还行,做网站类的就不行了,性能不好,封装的太多了。
      

  7.   

    能告诉我刷新这个组件的操作怎么写吗,我网上查了,用tabbox.invalidate();但是没反应
      

  8.   

    你可以用个按钮点击事件来刷新tabbox啊,
    我现在手头上没有环境,只能凭记忆告诉你。
    tabbox可能也有点击的事件,不确定,
      

  9.   

    跟你说下我的问题吧,我现在的问题就是想在按钮点击事件中刷新这个tabbox,但不知道怎么来刷新它,也没找到刷新这个组件的方法
      

  10.   

    这个是ZUL中的按钮+按钮的单击事件
    <button id="refreshButton" label="刷新" width="80px" onClick="controller.refresh()" />
    你的controller中定义refresh()方法。
    在refresh()方法中:
    //获得你的tabbox对象
    Tabbox tb = self.getFellowIfAny("tabbox");
    然后对tb操作即可。
    还不明白吗??
      

  11.   

    你可以先试试更改下它的式样,你就知道了。
    tb.setStyle("");
      

  12.   

    我是这样获取组件的Tabbox tbx = (Tabbox)Path.getComponent("/win/tabbox");是不是错了
      

  13.   

    TO:我是这样获取组件的Tabbox tbx = (Tabbox)Path.getComponent("/win/tabbox");是不是错了 你要不在你的controller中定义
    private Tabbox tbx;再添加getset方法。
    tbx和你ZUL文件中Tabbox的ID一致即可。
    tbx就是你的Tabbox对象,
    操作完执行下:tbx.renderAll();
      

  14.   

    我按照你说的试了一下,打印出来的tbx是null,而且tbx下也没有renderAll()这个方法
      

  15.   

    说明你
    <window id="payApplyPlanMgrWin" width="100%" 
    border="0" position="center,top" height="100%" apply="${testMgrController}">这个绑定没成功。
      

  16.   

    是不是你的按钮和你的tabbox在不同的window里?
      

  17.   

    贴代码吧,把ZUL和类都贴出来
      

  18.   

    zul就是之前貼的那些了
    zul:
    <window id="win" title="for info query" width="100%" border="normal"
    apply="org.zkoss.bind.BindComposer"
    viewModel="@id('vm') @init('com.xpx.mvc.info0001idquery.info0001idQueryViewModel')">
    <grid>
    <rows>
    <row>
    <div sclass="field-title">关键字</div>
    <div>
    <textbox value="@bind(vm.infoDO.id)" maxlength="50"/>
    </div>
    </row>
    </rows>
    </grid>
    <button label="查詢" onClick="@command('Query')"/>
         <tabbox id="tb" height="600px">
    <tabs id="tabs">
    <tab id="test01" label="資訊"/>
    <tab id="test02" label="test02"/>
    </tabs>
    <tabpanels>
    <tabpanel><include src="/mvc/test01Info/test01Info.zul"/></tabpanel>
    <tabpanel><include src="/mvc/test02Info/test02Info.zul"/></tabpanel>
    </tabpanels>
    </tabbox>info0001idQueryViewModel类:
    private Tabbox tb;
    public Tabbox getTb() {
    return tb;
    }
    public void setTb(Tabbox tb) {
    this.tb = tb;
    }
    @Command
    @NotifyChange("*")
    public void Query(){
    String keyword = this.infoDO.getId();
    this.infoDO.setId(keyword);
    Sessions.getCurrent().setAttribute("infoDOSession", this.infoDO);
    //刷新組件,这边要让得到的组件刷新,我这里实现不了,这部分需要你帮忙下,多谢
    //Tabbox tbx = (Tabbox)Path.getComponent("/win/tb");//这里打印出的tbx是:<Tabbox fUIQ40#tb>
    //System.out.println(tb+"******");//这里得到的组件是null
    }
      

  19.   

    你试试这句看看页面刷新了没?
    Tabbox tbx = (Tabbox)Path.getComponent("/win/tb");
    Tab tt = (Tab) tbx.getFirstChild().getFirstChild();
    tt.setLabel("测试测试");
      

  20.   

    你这只会另tab的标题更改了,但是里面include进来的window还是没刷新
      

  21.   

    我终于明白了,你是想把
    <tabpanel><include src="/mvc/test01Info/test01Info.zul"/></tabpanel>
    这里的页面更新是吧?
    这个我还没做过,
    你试试(Window)self.getFellow("win")
    获得你include页面的win对象,如果能获得这个对象,就好办了。
      

  22.   

    我本意是想让整個tabbox单独更新,这样底下include的兩個window资料就能更新显示了。就算能得到win的对象,组件也没更新的方法吧
      

  23.   

    Thanks!问题解决了,就像你说的,获得win对象
    Include test01Inc = (Include) Path.getComponent("/win/test01win");
    test01Inc.invalidate();