2011年7月2日 星期六

【ZK】開新視窗

在前一篇的【ZK】Radiogroup 中介紹了如何透過 radiogroup 篩選 listbox 裡的資料

這邊我們繼續介紹當使用者選擇了 listbox 中的某一列時,需要開一個新的視窗,並傳入參數

這邊採用的方法是運用 selectedItem 屬性

所以先設定 listbox 的 selectedItem 屬性,如下所示:


<listbox id="box" multiple="true" rows="10"
             model="@{win$composer.allCountry}"
             selectedItem="@{win$composer.current}">


還記得原來的這個 Controller,程式可以在第一篇中找到【ZK】資料庫應用

接著在這個 Controller :DataHandleController.java 中這定 getter/setter

package org.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dao.CountryDao;
import org.dao.impl.CountryDaoImpl;
import org.pojo.Country;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.SuspendNotAllowedException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.Radiogroup;
import org.zkoss.zul.Window;

public class DataHandleController extends GenericForwardComposer 
{
    private Country country = new Country();
    //省略....

    public void getCurrent(){
        //return country;
    }
 
    public void setCurrent(Country country){
        this.country = country;
        //用 Map 集合來帶所需傳遞的參數
        Map params = new HashMap();  
        params.put("id", country.getId());
        //使用 Executions.createComponents 建立一個新的 Window
        Window pop = (Window)Executions.createComponents("/index.zul", null, params);
  
        pop.setClosable(true);
        try {
            pop.doModal();  //執行動作 popup
        } catch (SuspendNotAllowedException e) {
            // TODO Auto-generated catch block
           e.printStackTrace();
        } catch (InterruptedException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
        }
    }
}


在以上成是中看到了,在選擇一個 listbox 中的某一個 item 時,會觸發事件到 setCurrent(Country)

這時候就可以在這邊做點手腳,運用 Executions 的 createComponents 方法來建立新視窗

如果需要傳遞參數時,還可以運用 Java 的 Map 集合將所需的資料傳入新的視窗中

接著看看新的視窗: index.zul


<?page title="Auto Generated index.zul"?>
<zk>
<window id="popwin" title="Hello World!!" border="normal" width="350px" height="350px" apply="org.controller.RetriverParams">

</window>
</zk>


在 以上的 window 元件中應用了一個 Controller RetriverParam.java 負責抓取參數並印出
package org.controller;

import java.util.Map;
import org.zkoss.zhtml.S;
import org.zkoss.zk.ui.event.CreateEvent;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.ForwardEvent;
import org.zkoss.zk.ui.util.GenericForwardComposer;

public class RetriverParams extends GenericForwardComposer
{
    // 新增該 window 的 create 事件
    public void onCreate$popwin(Event e) throws Exception {
        CreateEvent ce = (CreateEvent) ((ForwardEvent) e).getOrigin();
        //透過該事件的 getArg() 取的傳過來的 Map 集合物件
        Map params = ce.getArg();
        System.out.println(params.get("id"));    
    }
}

下一篇介紹 如何運用 Javascript 開新視窗,並傳遞參數【ZK】Javascript 開新視窗

沒有留言:

張貼留言