`
xxj
  • 浏览: 426615 次
  • 性别: 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--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 java原代码下载

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

    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-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中IE、Firefox兼容Enter代替Tab的Javascript

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

    AOM中的常用JavaScript

    在JavaScript的世界里,AOM(Accessibility Object Model)是一种新兴的标准,它旨在提升Web内容的可访问性,使得残障人士能够更好地与网页交互。AOM是Web开发领域中一个非常重要的概念,它与DOM(Document Object ...

Global site tag (gtag.js) - Google Analytics