`

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

 

分享到:
评论
2 楼 ogoodnight 2010-12-20  
看了後,還不知怎麼應用,請求續貼
1 楼 edusaj 2009-11-24  
你好,如何应用模板呢?谢谢。

相关推荐

    zk框架demo

    **ZK框架详解** ZK框架是一款高效且易用的Java Web开发框架,它专为构建富客户端(Rich Client)...在"zk框架demo"中,我们可以深入研究ZK的各个方面,从基础组件的使用到高级功能的实现,不断提升自己的Web开发技能。

    zk.zip_zk

    《ZK 5 Essentials.pdf》这本书很可能详细介绍了ZK 5的基础概念、组件使用、事件处理、布局管理以及ZUL脚本的编写等方面的内容。通过阅读这本书,开发者可以全面掌握ZK 5的核心技术和最佳实践,从而在Web开发领域中...

    zk框架学习

    **下载ZK包和Demo**:访问ZK官网,根据操作系统选择合适的ZK包(如Windows下选择`zk-bin-5.0.2.zip`),同时下载一个包含XML模板的Demo包。 2. **下载ZK Studio**:可以通过在线方式安装ZK Studio插件至MyEclipse...

    zk主题生成器

    在传统的ZK主题创建过程中,开发者通常需要编写大量的CSS代码来定义UI元素的样式,这不仅耗时,而且对CSS不熟悉的开发者来说难度较大。ZK主题生成器则简化了这一过程,让不具备专业CSS技能的用户也能参与主题设计。 ...

    (XF - 8)ZK 宏的使用与定义Demo

    而宏在ZK中则扮演着代码复用和模板化的角色,有助于提高开发效率和代码质量。 1. **ZK宏定义**: ZK宏是一种预处理指令,可以在页面布局或组件渲染时执行。它们允许开发者定义可重用的代码块,通常包括一系列的...

    grovvy Reference zk

    - **ZUML(ZK User Interface Markup Language)**:这是一种专为ZK设计的标记语言,用于定义组件的布局和行为。ZUML支持条件语句、循环结构等高级特性,可以用来构建复杂的UI逻辑。 - **XML Namespaces**:ZK使用...

    ZK 开发手顺

    ZK的核心理念是将传统的桌面应用开发模式引入到Web环境中。它通过组件化的方式,允许开发者像创建桌面应用一样创建Web应用,极大地简化了Web UI的开发。ZK使用服务器驱动的模型,即所有的用户交互都在服务器端处理,...

    Apress.ZK.Ajax.without.the.Javascript.Framework.Aug.2007

    3. **ZK中的Ajax实现**:ZK框架提供了内置的Ajax支持,如Ajax事件、Ajax组件和Ajax行为。这部分内容将详细介绍如何在ZK中创建和使用这些特性,实现无刷新的用户体验。 4. **组件和事件处理**:ZK的组件库非常丰富,...

    ZK开发手册 3.06 Word版

    4. **表达式语言(EL)**:ZK使用一种特殊的表达式语言,允许在XML布局文件中直接进行数据绑定和逻辑处理,增强了模板的动态性。 5. **ZUL文件**:ZK使用ZUL(ZK User Interface Language)作为其标记语言,用于...

    ZK开发手册 中文版 3.50 -荐

    ZUL(ZK User Interface Language)是ZK特有的界面描述语言,用于定义组件结构、样式和事件处理。通过ZUL文件,开发者可以编写可复用的界面模板,提高开发效率。 8. **MVC模式** ZK遵循Model-View-Controller...

    ZkIntro:一个带有 Bootstrap 的简单 ZK 项目

    此外,ZK还支持数据绑定和模板引擎,可以轻松实现界面和模型之间的数据同步。 **构建和运行ZK应用** 为了运行“ZkIntro”项目,你需要一个Java开发环境(如JDK)和一个支持ZK的Servlet容器(如Tomcat或Jetty)。...

    JAVA上百实例源码以及开源项目源代码

    Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用...

    个人博客小程序源码,仅做个人学习测试

    - `view`:视图层,存放小程序的页面模板和界面布局。 - `wxapp`:可能包含了小程序的主文件,如app.js、app.json、app.wxss等,定义了小程序的整体逻辑、配置和样式。 - `info.ini`:可能存储了应用的基本信息或...

    淘宝卡密自助提取系统

    7. **css**目录:这个目录存放了Cascading Style Sheets (CSS) 文件,用于定义网页的布局和样式。通过CSS,开发者可以控制页面元素的颜色、字体、大小、位置等,实现美观的界面设计。 8. **MD5加密**:MD5.asp可能...

Global site tag (gtag.js) - Google Analytics