项目中遇到一个棘手的问题,使用GWT的cellTable的时候,要更改一个单元格的显示问题。如果仅仅是一个单独的cell 可能会有比较好的处理办法,比如可以找到这一列,然后更新整个cellTable,但此处我用到的是一个复合cell,即compositeCell,API如下:

  

 public class CompositeCell<C>
extends AbstractCell<C>
A Cell that is composed of other Cells. When this cell is rendered, it will render each component Cell inside a span. If the component Cell uses block level elements (such as a Div), the component cells will stack vertically.

  所以要取到具体的cell有些不易。

  此次更改cell的情景是: 一个entity中字段没有关联到实体,而是存储的一个实体的ID,但是cellTable显示的时候,不可能显示一个关联ID的,而是需要根据这个ID去查找该关联实体的表,而此处的查询又是异步的。

  首先思路是这样的: 第一步肯定是要先取得要更改数据的那一列的;第二步取到具体的那一个cell; 第三步就是更改cell里面的数据了。

  这里的cell 需要使用样式,所以代码是这样的:

 final Cell<String> cell = new TextCell(new SafeHtmlRenderer<String>() {

             @Override
public void render(String arg0, SafeHtmlBuilder arg1) {
} @Override
public SafeHtml render(String str) {
return new SafeHtmlBuilder().appendHtmlConstant("<span class='categoryName'>"+str+"</span>").toSafeHtml();
}
});

会被渲染加上一个class为"categoryName"的span 标签。

  首先查找出这个cell,这里关键代码如下:

  

 int index = dataProvider.getList().indexOf(item);
NodeList<TableCellElement> nodeList = entityTable.getRowElement(index).getCells();
for (int i = 0; i < nodeList.getLength(); i++) {
TableCellElement tableCellElement = nodeList.getItem(i);
List<Element> elements = getRowElements(tableCellElement);
for (Element element : elements) {
String className = element.getClassName();
if(className!=null && className.equals("categoryName")){
element.setInnerHTML(caterotyString + "&nbsp;&nbsp;");
}
}
elements.clear(); //每次循环完一列就清空保存元素的集合
}

  每个cellTable 都需要一个dataProvider来显示数据,一条数据为一行,那么可以根据这个dataProvider中存放数据的位置来确定此数据是第几行的,这样就实现了上面说的第一步操作。代码中第2行根据行数取得这一行的所有单元格元素,第3行代码是取得每一个单元格中的元素。这样做的话就能解析那些复合单元格中每个单元格了。实现了上面所说的第二步操作。在取得所有的元素之后,我们可以利用刚刚设置的class名字来定位到精确的元素, 也可以根据node的id。因为有复合控件的存在,可能存在要解析遍历多次的问题,所以第5行代码使用了一个递归循环,取得所有的元素,代码如下:

     // 递归取得每一列中的所有元素,包括自身
private List<Element> elements = new ArrayList<Element>();
private List<Element> getRowElements(Element element){
elements.add(element);
NodeList<Node> nodes = element.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.getItem(i);
Element childElement = node.cast();
if(childElement.getChildCount()>0){
getRowElements(childElement);
}else{
elements.add(childElement);
}
}
return elements;
}

其中第8行代码中使用了一个cast方法,cast方法的API如下:

 <T extends JavaScriptObject> T
cast()
A helper method to enable cross-casting from any JavaScriptObject type to any other JavaScriptObject type.

是对JavaScriptObject类进行互相转换的,Element和Node 都是JavaScriptObject的子类。继承关系如下:

  

 java.lang.Object
extended by com.google.gwt.core.client.JavaScriptObject
extended by com.google.gwt.dom.client.Node
extended by com.google.gwt.dom.client.Element

这里也可以不转换类型,而是在调用递归的地方使用,返回一个Node的List,然后在循环Node的时候进行cast操作,因为className只有Element才有,所以必须要转换。

总结:gwt因为是用java写"html",所以提供了很多可以操作底层的类供我们使用,可以取得我们想要的"html"标签或者元素,善于发掘,就会找到我们想要的。

  

GWT异步更改cellTable中cell的数据显示的更多相关文章

  1. iOS中Cell高度如何能够自动适应需要显示的内容

    本文的代码例子 : "Cell行高自适应.zip" http://vdisk.weibo.com/s/Gb9Mt 下面我们来看看代码.我需要一个第三方库EGO异步下载.addtio ...

  2. AJAX异步更改数据库

    前段时间做了一个小网站,里面有个小功能感觉挺好的,在此与大家分享一下,还请各位大神不要笑话小弟的无知. 此功能大概是这个样子的:点击下图中的类别名称,就可以对类别进行修改. 点击类别名称以后,原来的表 ...

  3. 更改mysql中当前auto_increment的值的方法

    最近给自己网站更改mysql中当前auto_increment的值 如果在mysql中一个表test中的ID字段设为auto_increment插入两条记录后ID=2,这时删除1条记录,再插入一条变成 ...

  4. IOS Table中Cell的重用reuse机制分析

    IOS Table中Cell的重用reuse机制分析 技术交流新QQ群:414971585 创建UITableViewController子类的实例后,IDE生成的代码中有如下段落: - (UITab ...

  5. jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法

    jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法   在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们 ...

  6. 更改XAMPP中MySQL数据库的端口号

    更改XAMPP中MySQL数据库的端口号 如果电脑上已安装MySql数据库,还想用XAMPP中自带的数据库就需要更改XAMPP中数据库的端口号,避免和已安装的数据库冲突.本例以更改为3307端口号为例 ...

  7. java更改数据库中的数据

    不废话,上代码 package com.ningmeng; import java.sql.*; /** * 1:更改数据库中的数据 * @author biexiansheng * */ publi ...

  8. FPGA异步时钟设计中的同步策略

    1 引言    基于FPGA的数字系统设计中大都推荐采用同步时序的设计,也就是单时钟系统.但是实际的工程中,纯粹单时钟系统设计的情况很少,特别是设计模块与外围芯片的通信中,跨时钟域的情况经常不可避免. ...

  9. Python 更改cmd中的字色

    没有gui的python程序是在cmd窗口中运行的,黑色背景,灰色的字,确实很复古,不符合现代人的使用习惯-同事在用我写的小工具时,清一色的字色,看起来会没有重点性,因此我就想通过更改cmd中的字色来 ...

随机推荐

  1. css transform常用变化解析

    本文旨在对常用变化做最直观的简析 translate 移动 translateX() X轴正方向移动(单位可为px,也可为%,为%时以自身为参照物) translateY() Y轴反方向移动 tran ...

  2. web框架详解之三Modal

    一.Modal操作之创建表,添加数据 1. 配置Django中settings的设置连接mysql数据库,然后在mysql数据库中创建库 2. 在models中创建表.继承Model 3. 在sett ...

  3. 【简单dp】poj 1458 最长公共子序列【O(n^2)】【模板】

    最长公共子序列可以用在下面的问题时:给你一个字符串,请问最少还需要添加多少个字符就可以让它编程一个回文串? 解法:ans=strlen(原串)-LCS(原串,反串); Sample Input abc ...

  4. mybaties mapping中if

    mapping中 if的简单使用 <insert id="addPassenger" resultMap="EmpResultMap" parameter ...

  5. SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法

    软件152 尹以操 首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml ...

  6. vue.js计算属性 vs methods

    计算属性:Vue.js 模板内的表达式非常便利,但是缺点就是只能用于简单的运算,如果模板中有太多的逻辑运算会让模板不堪重负且难以维护.恰恰计算属性可以处理复杂的逻辑运算,也就是说对于任何复杂逻辑你都应 ...

  7. Python去除字符串的空格

    Python能够找出字符串开头和末尾多余的空白. 要确保字符串末尾没有空白,可使用方法rstrip(). 还可以剔除字符串开头的空白,或同时剔除字符串两端的空白. 为此,可分别使用方法lstrip() ...

  8. java中finally的使用

    以前认为finally没用,但是实际上在try使用中是不可缺少的.

  9. python中的list和array的不同之处 2

    版权声明:本文为博主非原创文章,未经博主允许可以转载.     Python中的list和array的不同之处 python中的list是python的内置数据类型,list中的数据类不必相同的,而a ...

  10. 命令——WPF学习之深入浅出

    WPF学习之深入浅出话命令   WPF为我们准备了完善的命令系统,你可能会问:“有了路由事件为什么还需要命令系统呢?”.事件的作用是发布.传播一些消息,消息传达到了接收者,事件的指令也就算完成了,至于 ...