`
xxj
  • 浏览: 431910 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

AOM2 组件介绍(一):DataGrid

    博客分类:
  • AOM
阅读更多
DataGrid 应该是最常用的组件之一,第一篇我们先来介绍AOM2组件之DataGrid.

我们先来回顾下之前的做法:
@Bind
private List<user> grid;


然后直接在页面上编码,显示数据。
<w:datagrid paged="true" rows="20" id="users" contextmenu="true" toolbarposition="top" var="user">
  <w:outputcolumn header="用户名" value="#{user.username}">
  <w:outputcolumn header="电子邮件" value="#{user.email}">
</w:outputcolumn>


AOM2的对DataGrid 进行了重新设计,主要通过ViewProvider,RowDataProvider分类提供视图和数据的展示


一起来实践:

新建一Faces 页面 grid.xml。
<f:view xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:w="http://www.apusic.com/jsf/widget" xmlns:layout="http://www.apusic.com/jsf/layout" xmlns:ajax="http://www.apusic.com/jsf/ajax" renderkitid="AJAX">
	<w:head>
		
	</w:head>
	<w:page title="Grid Demo">
		<w:datagrid id="grid">
	</w:datagrid>
</w:page>


很简单,就写了一行代码
<w:dataGrid id="grid"/>


在GridBean 中新建一UIDataGrid,并绑定到id为grid的页面组件
@Bind
private UIDataGrid grid;


新建一个class:User.java用来展示数据
public class User {
	private String id;
	private String name;
	private String email;
        //getter and setter ...

        public User(String id, String name, String email) {
		super();
		this.id = id;
		this.name = name;
		this.email = email;
	}

	public User() {

	}
        //顺手写几个测试数据,用于下面的测试
	public static List<User> samples(){
		List<User> users = new ArrayList<User>();
		users.add(new User("1","AAA","a@g.com"));
		users.add(new User("2","bbb","b@g.com"));
		users.add(new User("3","CCC","c@g.com"));
		users.add(new User("4","ddd","d@g.com"));
		users.add(new User("5","EEE","e@g.com"));
		users.add(new User("6","fff","f@g.com"));
		return users;
	}
}


新增value属性,就是这个grid的数据来源。
@Bind(id = "grid", attribute = "value")
private List<User> users = User.samples();


新增viewProvider属性,这个属性是grid视图展示的一个提供者,包括 Grid的数据列模型,Grid表头的描述模型 等,可以通过viewProvider来设置显示的名称,宽度,是否可以排序,转换类型,对齐方式,以及是否是隐藏列。还可以配置显示复杂的表头,譬如合并多行/多列等
	@Bind(id = "grid", attribute = "viewProvider")
	private GridViewProvider viewProvider = new GridViewProvider() {
                //GridViewProvider 是一接口,需要我们实现如下三个方法
                //getColumnModel 为Grid的数据列模型,
		public GridColumnModel getColumnModel(Object input) {
			GridColumnModel model = new GridColumnModel();
                        //新增列,指定id为name
			GridColumn column = new GridColumn("name");
                        //指定宽度为150
                        column.setWidth(150);
                        //可以排序
			column.setEnableSort(true);
                        //添加到grid的数据模型 
			model.addColumn(column);

                        //新增列,指定id为email
			column = new GridColumn("email");
			model.addColumn(column);

                        //新增列,指定id为id
			column = new GridColumn("id");
                        //并将该列设置为隐藏列
			column.setHidden(true);
			model.addColumn(column);
                        
                        //在展示数据的时候,显示行号 
			model.setShowRowNumber(true);
			return model;
		}

		public GridHeaderModel getHeaderModel(Object input) {
			GridHeaderModel model = new GridHeaderModel();
			GridHeader header = new GridHeader();
			GridHeaderCell cell;
                        //新增列的头单元,并命名为"名称" 
			cell = new GridHeaderCell("名称");
			header.addCell(cell);
                        //新增列的头单元,并命名为"电子邮件"    
			cell = new GridHeaderCell("电子邮件");
			header.addCell(cell);
			model.addHeader(header);
			return model;
		}

		public GridSelectionModel getSelectionModel(Object input) {
			return null;
		}
	};


新增rowDataProvider,DataGrid渲染每一行时,会将每一行的数据传递给下面的getLabel方法,由他来决定如何展示数据
@Bind(id = "grid", attribute = "rowDataProvider")
	private GridRowDataProvider rowProvider = new GridRowDataProvider() {
                //其中 rowData为每行数据,column 为列信息。
                //通过column.getId可以获得上面定义的列ID
		public Object getLabel(Object rowData, GridColumn column) {
                        //获取当前列的ID
			String id = column.getId();
			User user = (User) rowData;
                        //判断,根据不同的id,展示不同的数据,如果上面的Grid的数据列模型设置了转换,那么会自动调用
			if ("name".equals(id)) {
                                //列的id是name,显示用户名
				return user.getName();
			} else if ("email".equals(id)) {
                                //列的id是email,显示电子邮件
				return user.getEmail();
			}
			return null;
		}
	};


OK,一个基本的数据展示就完成了。可以简单的测试下,浏览下效果。

图就忽略了。。。。

没有分页,高度一直拉到最下面,太丑了:(

一:你可以用最上面的方法,直接在页面上写上属性
<w:datagrid paged="true" rows="20" contextmenu="true" toolbarposition="top" .... />


二:也可以直接通过元数据@ComponentAttributes,批量给组件添加属性,首先还是将上面的datagrid恢复原来的代码
<w:datagrid id="grid"/>


在GridBean代码中,新增
@ComponentAttributes(id = "grid")
private Map<String, Object> config;


在构造函数里面,增加相应的属性
public GridBean() {
    this.config = = new HashMap<String, Object>();
    //分页
    this.config.put("paged", true);
    //每页10条记录
    this.config.put("rows", 10);
    //根据记录的多少,自动调整表格高度
    this.config.put("autoHeight", true);
    //.....
}



也许有人疑惑了,问,这里的属性paged,rows,autoHeight那里来的,如果你不知道,你可以查看Faces页面对应的属性,这个和那里是一样的关键字。

再次测试下,浏览效果


不错。

动态绑定数据:
下面我们介绍第二个常用的功能,如何动态的绑定Gridl的数据。
首先在那个User.java中新增一个方法,我们填充更多的内容
	public static List<User> samples2(){
		List<User> users = new ArrayList<User>();
		for(int i=0;i<10;i++){
			users.addAll(samples());
		}
		return users;
	}


在页面上放一个button
<w:form>
  <w:button id="btn" />
</w:form>
<w:dataGrid id="grid"/>


绑定button的value,显示字符为“Reload Data”
@Bind(id = "btn", attribute = "value")
private String btn_label = "Reload Data";


绑定一个Action,当点击按钮的时候,触发该方法,重新加载新的数据。
@Action(id = "btn")
public void changeValues() {
        //首先,赋值新的数据
	this.users = User.samples2();
        //配置第一个显示的记录,这里是估计用了2,用来演示,如果不填写,或者0 那么将会全部展示
	grid.setFirst(2);
        //重新配置表格的每页显示的条数,更新为15条每页
	grid.setRows(15);
        //重新版定Grid,展示新的数据
	this.grid.rebind();
}


注:重新加载数据的时候,不仅仅可以重新赋值,还可以更新viewProvider,rowDataProvider,如 (该片段代码来自于AOM RCDEMOS,推荐阅读):

grid.setViewProvider(GridBeanHelper.getTrainViewProvider());
grid.setRowDataProvider(GridBeanHelper.getTrainRowProvider());


收工,明天继续。
Done!
分享到:
评论
2 楼 xxj 2008-05-26  
AOM2 正式版的DataGrid已经重新设计了,你可以试试。
1 楼 vieri122 2008-05-23  
在AOM2.0中datagird的问题真的很多,不过听说已经修复,还没来得及试。
期待你发布新的AOM文章

相关推荐

    QTP AOM帮助文档

    使用QTP的automation object model,可以对QTP进行自动化编程,从而自动对QTP进行选项设置、自动运行测试(或组件),而无需使用QTP界面手工进行这些操作。 如果要重复多次的完成同一项工作任务,或重复多次运行同一...

    编译android VLC时,需要的组件:aom-v1.0.0.errata.1.tar.gz

    在这个过程中,`aom-v1.0.0.errata.1.tar.gz`是一个重要的组件,它是Google开放媒体联盟(Alliance for Open Media, AOMedia)的AV1编码器开源实现——AOMedia Video 1(AV1)的一个版本。AV1是一种高效、开放标准的...

    AOM 初体验(一)

    标题"AOM初体验(一)"暗示我们即将探讨的是一篇关于Advanced Operation Management(AOM,高级运营管理)的入门文章,可能是针对某一个特定工具或框架的介绍。描述提到"整个工程打包下载",意味着这可能是一个软件...

    AOM介绍-Web开发敏捷之道.

    OM提供了一种简化的编程模型,通过使用如`w:textField`、`w:button`、`w:dataGrid`等组件标签,以及`@Bind`、`@ValidateLength`、`@DataModel`、`@Action`等注解,开发者可以轻松地实现数据绑定、校验、动作处理等...

    -AoM--Client:客户端实施改装平台

    我们希望您成为该社区的一员。依赖AoM 需要 Visual Studio &gt;=2013 和 CMake &gt;=3.2 才能编译。在为 AoM 做出贡献之前,请: 确保您熟悉 AoM 的目标,这样我们就不会坐视无用的代码。 确保您的代码符合以下格式指南...

    aom-v1.0.0.errata.1.tar.gz

    标题 "aom-v1.0.0.errata.1.tar.gz" 指的是一个名为 "aom" 的开源项目,其版本为1.0.0的错误修复更新(errata)第一版,并以tar.gz格式打包。这个压缩包包含了项目的一些核心文件和文档,表明这可能是用于开发或维护...

    AOM相关.rar

    AOMedia的工作不仅限于AV1,他们还在研发其他相关技术,例如AV2,这是一个正在研发中的下一代编码标准,预计会提供更大的编码效率提升。因此,压缩包也可能包含有关这些未来技术的早期研究或预览资料。 总之,...

    aom-v1.0.0.errata.1.zip

    标题 "aom-v1.0.0.errata.1.zip" 指示这是一个与开源视频编码库AV1相关的更新或修正文件。"errata"通常用于标识软件发布中的错误或修正,这意味着这个压缩包可能包含了针对aomedia(aom)v1.0.0版本的一些修复或改进...

    QTP/UFT AOM

    AOM 通过engine.vbs 启动UFT。

    AOM java原代码下载

    AOM(Academy of Motion Picture Arts and Sciences)是一个与电影技术相关的组织,而在此上下文中,它似乎指的是一个特定的Java项目或库。"AOM java原代码下载"的标题表明我们正在讨论的是该组织的Java源代码,可能...

    aom-private:aom-私人

    【标题】"aom-private:aom-私人" 暗示了这是一个与开源视频编码库AOMedia(AOM)相关的私有或个人分支。AOMedia是一个由多个公司和组织联合开发的项目,旨在创建高效、高质量且跨平台的视频编解码器。这个"aom-私人...

    aom.zip_3344aom_aom.avcom_av1_h264_zip

    标题 "aom.zip_3344aom_aom.avcom_av1_h264_zip" 暗示了这是一个与视频编码相关的压缩文件,其中包含了AV1编码器的源代码,可能还有与H264编码的对比或转换相关的资料。描述 "av1 codec source open c++" 明确指出这...

    第二波又来了:AOM3.2之8款皮肤分享(for extjs3.31)

    AOM,全称Antelope on the Moon,是一个基于JavaScript和CSS的开源组件库,它扩展了JavaServer Faces (JSF)的功能,提供了一套丰富的用户界面组件。在AOM 3.2版本中,开发者为用户提供了一系列新的视觉风格,旨在...

    X-AOM权识区块链新经济 -泛AI时代投资多元的解决方案.pdf

    总结来说,X-AOM权识区块链新经济项目致力于在AI时代创建一个投资多元化的解决方案,通过区块链技术打破传统经济模式,实现数据价值的公平分配,促进全球经济的健康发展。随着5G、大数据、AI等新型基础设施的建设,...

    海洋沉积物甲烷厌氧氧化作用(AOM)及其对无机硫循环的影响

    海洋沉积物甲烷厌氧氧化(AOM)作用是一个涉及甲烷和硫酸盐的生物地球化学过程,甲烷作为一种温室气体,在海洋沉积物中通过与硫酸盐还原菌作用被转化为二氧化碳或碳酸盐,同时硫酸盐作为电子受体被还原为硫化物。...

    AOM金蝶入门

    AOM金蝶控件开发指南,入门,供大家学习

    AOM中IE、Firefox兼容Enter代替Tab的Javascript

    AOM(Accessibility Object Model)是一个新兴的Web标准,旨在增强网页的无障碍性。虽然这个主题并未直接提及AOM,但它暗示我们可能需要关注无障碍访问的实践,确保回车键的替代功能同样适用于屏幕阅读器和其他辅助...

Global site tag (gtag.js) - Google Analytics