在项目的开发过程中,有些布局是固定的,为了布局的统一,通常会制定一定的模版,每个页面都继承这个模版,这样所有程序的实现都很固定,而且写法都大同小异,从而大大提高了代码的复用率。
1、定义模版的各个类
/**
*
* @功能:模版主类,做布局之用
* @创建人 gao_jie
* @创建日期 Mar 3, 2009
* @版本 1.0
*
*/
public abstract class WindowTemplet extends Borderlayout implements
AfterCompose {
/**
* 上面框架
*/
private Div m_mainCenterNorthDiv;
/**
* ZK框架对象
*/
private LayoutRegion borderlayout_navigate;
/**
* 中心布局
*/
private LayoutRegion main_center;
/**
* 子窗口集合
*/
private List<ChildWindow> divs = new ArrayList<ChildWindow>();
/*
* (非 Javadoc)
*
* @see org.zkoss.zk.ui.ext.AfterCompose#afterCompose()
*/
public void afterCompose() {
this.createMainBorderLayout();
this.getBorderlayout_navigate().appendChild(
this.createNavigateComponent());
this.doWindowTempletInit();
}
/**
* 窗体返回操作
*/
abstract protected void onReturn();
/**
* 初始化
*/
abstract protected void doWindowTempletInit();
/**
* 调用各子窗口处理过程
*
* @param command
*/
protected void processCommand(ConsoleCommand command) {
for (Object child : divs) {
try {
((ChildWindow) child).processCommand(command);
} catch (Exception e) {
e.getMessage();
}
}
}
/**
* 创建主体框架
*/
private void createMainBorderLayout() {
LayoutRegion main_north = this.createLayoutRegion("north", null,
"none", true, false);
main_center = this.createLayoutRegion("center", null, "none", true,
true);
this.appendChild(main_north);
this.appendChild(main_center);
this.setBorderlayout_navigate(main_north);
}
/**
* 创建一个LayoutRegion
*
* @param name
* @param size
* @param border
* @param flex
* @param autoscroll
* @return
*/
private LayoutRegion createLayoutRegion(String name, String size,
String border, Boolean flex, Boolean autoscroll) {
LayoutRegion region = null;
try {
if ("north".equals(name))
region = (LayoutRegion) Class.forName(
"org.zkoss.zkex.zul.North").newInstance();
if ("south".equals(name))
region = (LayoutRegion) Class.forName(
"org.zkoss.zkex.zul.South").newInstance();
if ("west".equals(name))
region = (LayoutRegion) Class
.forName("org.zkoss.zkex.zul.West").newInstance();
if ("east".equals(name))
region = (LayoutRegion) Class
.forName("org.zkoss.zkex.zul.East").newInstance();
if ("center".equals(name))
region = (LayoutRegion) Class.forName(
"org.zkoss.zkex.zul.Center").newInstance();
} catch (Exception e) {
e.getMessage();
}
if (null != size)
region.setSize(size);
if (null != border)
region.setBorder(border);
if (null != flex)
region.setFlex(flex);
if (null != autoscroll)
region.setAutoscroll(autoscroll);
region.setStyle("background-color:#F5F6CC");
return region;
}
/**
* 创建容器
*
* @param url
* @param position
*/
protected Include createContainer(String url) {
Include include = new Include();
include.setSrc(url);
main_center.appendChild(include);
return include;
}
/**
* 创建标题部分
*
* @return
*/
private Div createNavigateComponent() {
Div div = new Div();
Hbox titleHbox = new Hbox();
titleHbox.setSpacing("0");
titleHbox.setWidth("99%");
titleHbox.setHeight("36px");
titleHbox.setStyle("position:relative;top:15px");
Separator separator = new Separator();
separator.setBar(true);
div.appendChild(titleHbox);
div.appendChild(separator);
Hbox headHbox = new Hbox();
headHbox.setStyle("align: left");
Space blank = new Space();
blank.setStyle("color:#F5F6CC; text-align: left");
Label title = new Label();
title.setId("titlelabel");
title.setWidth("30%");
title
.setStyle("color: #000000; FONT-FAMILY: Verdana, Helvetica, sans-serif; font-size:12px; text-align: left");
Div backDiv = new Div();
backDiv.setAlign("right");
backDiv.setWidth("90%");
headHbox.appendChild(blank);
headHbox.appendChild(title);
titleHbox.appendChild(headHbox);
titleHbox.appendChild(backDiv);
Label back = new Label();
back.setId("backlabel");
back.setValue("返回");
back.setVisible(false);
back
.setStyle("cursor:hand ;color:blue;background-color:#F5F6CC;font-size:12px;text-decoration:underline");
backDiv.appendChild(back);
back.addEventListener("onClick", new EventListener() {
public void onEvent(Event arg0) throws Exception {
onReturn();
}
});
m_mainCenterNorthDiv = new Div();
div.appendChild(m_mainCenterNorthDiv);
return div;
}
private LayoutRegion getBorderlayout_navigate() {
return borderlayout_navigate;
}
private void setBorderlayout_navigate(LayoutRegion borderlayout_navigate) {
this.borderlayout_navigate = borderlayout_navigate;
}
public String getNavigateTitle() {
Label label = (Label) this.getFellow("titlelabel");
return label.getValue();
}
public void setNavigateTitle(String navigateTitle) {
Label label = (Label) this.getFellow("titlelabel");
label.setValue(navigateTitle);
}
public boolean getShowReturnButton() {
Label back = (Label) this.getFellow("backlabel");
return back.isVisible();
}
public void setShowReturnButton(boolean showReturnButton, String lable) {
Label back = (Label) this.getFellow("backlabel");
back.setVisible(showReturnButton);
if (lable != null) {
back.setValue(lable);
}
}
protected List<ChildWindow> getDivs() {
return divs;
}
/**
* 获取TempletWindow
*
* @return
*/
public static WindowTemplet getTempletWindow() {
WindowTemplet win = (WindowTemplet) Path
.getComponent("//templetwindow/mainwnd");
return win;
}
}
/**
*
* @功能:子窗体类
* @创建人 gao_jie
* @创建日期 Mar 3, 2009
* @版本 1.0
*
*/
public abstract class ChildWindow extends Window {
private static final long serialVersionUID = 1L;
/**
* 构造函数
*/
@SuppressWarnings("unchecked")
public ChildWindow() {
WindowTemplet templet = getParentWindow();
if (templet != null)
templet.getDivs().add(this);
}
// 获取父窗口
protected WindowTemplet getParentWindow() {
return WindowTemplet.getTempletWindow();
}
// 处理命令过程
abstract protected void processCommand(ConsoleCommand command);
// 发送命令到主窗口
protected void sendCommand(ConsoleCommand command) {
WindowTemplet templet = getParentWindow();
if (templet != null)
templet.processCommand(command);
}
}
/**
*
* @功能 初始化命令
* @创建人 gao_jie
* @创建日期 Mar 3, 2009
* @版本 1.0
*
*/
public class InitCommand extends ConsoleCommand {
/**
* 构造函数
*/
public InitCommand() {
super("Init");
}
}
/**
*
* @功能 控制命令
* @创建人 gao_jie
* @创建日期 Mar 3, 2009
* @版本 1.0
*
*/
public class ConsoleCommand {
private String name;
private Object[] paras;
public ConsoleCommand() {
this("", new Object[] {});
}
public ConsoleCommand(String name) {
this(name, new Object[] {});
}
public ConsoleCommand(String name, Object[] paras) {
this.name = name;
this.paras = paras;
}
// 命令名称
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 命令参数
public Object[] getParas() {
return paras;
}
public void setParas(Object[] paras) {
this.paras = paras;
}
public boolean equals(Object obj) {
if (obj instanceof ConsoleCommand) {
return ((ConsoleCommand) obj).getName().equalsIgnoreCase(name);
}
return false;
}
}
2、应用模版