zk中定义布局模版实现

在项目的开发过程中,有些布局是固定的,为了布局的统一,通常会制定一定的模版,每个页面都继承这个模版,这样所有程序的实现都很固定,而且写法都大同小异,从而大大提高了代码的复用率。

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、应用模版

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值