使用TreeItem和FlexTable的自定义GWT树表

时间:2012-06-28 09:20:25

标签: gwt

GWT不包含TreeTable,但我的项目要求包含树表。所以我使用TreeFlexTable创建了它。

这里是Bean类:Item

class Item
{
ItemType itemType; //Parent,Child Enum type
long parentId;
long amount;
String itemName;
String qty;
String rate;
//Setter / Getter Methods
}

这是自定义TreeItem类,它具有父项和&之间的关系。儿童用品。我已经使用TreeItemNode创建了一行。

 public class TreeItemNode extends TreeItem {
        private FlexTable table; //this will use to access child
        private FlexTable parentTable; //This will use to access parent of particular child.
    //This constructor create parent node
       public TreeItemNode(FlexTable parentTable) {
            setWidget(parentTable);
            this.parentTable=parentTable;
            setState(true); 
        }
     //The method used to add Child items in parent
        public TreeItem addItem(Widget widget)  {
            this.table=(FlexTable) widget;
            TreeItem ret = new TreeItem(widget);
            addItem(ret);
            return ret;
        }
    }

使用项目列表,此方法创建具有父节点关系和子节点关系的树。

class CustomTreeTable extends Tree
{
    public void createTreeTable() {
            //This map store parent id and tree item object for letter fetch the parent node and add child node in it
              treeItemMap = new HashMap<Long, BOQTreeItem>();
            for (Item item : itemList) {
                if (item.getParentItemId() == 0) {
                //Create new parent node 
                    TreeItemNode itemTreeItem = new TreeItemNode(addChildItem(item,
                            new FlexTable(), true),
                            "gwt-TreeNode");
                    treeItemMap.put(item.getId(), treeItem);
                    addItem(itemTreeItem);
                } else {
                //Add child node
                    if (treeItemMap.containsKey(item.getParentItemId())
                            && treeItemMap.get(item.getParentItemId()) != null) {
                        FlexTable dataFlextable = treeItemMap.get(
                                item.getParentItemId()).getTable();
                        if (dataFlextable == null) {
                            dataFlextable = new FlexTable();
                            treeItemMap.get(item.getParentItemId()).setTable(
                                    dataFlextable);
                        }
                        FlexTable treeTable = addChildItem(item, dataFlextable,
                                false);
                        treeItemMap.get(item.getParentItemId()).addItem(treeTable);
                    }
                }
            }
        }

}

使用我的表格如下。 +是我的树节点打开/关闭,如:

ItemName qty rate amount
+ item1   11   1   11   //parent item
---------------------------
- item2   11   2   22
--------------------------------
    SubItemName qty rate amount //child item
     subItem1    5   2    10
     subItem2    8   5    40
------------------------------------

问题是当我想在一个原始(子项)中计算qty * rate而不是使用行索引时可以做但是如果我想要计算所有子项&amp;显示在父行中。然后逻辑变得如此复杂。所以我只想知道我实现的逻辑,比如将实例存储在map和managed中。这是对的吗?我正朝着正确的方向前进或走错路。

1 个答案:

答案 0 :(得分:0)

使用DataGrid Widget可能更容易实现您想要实现的目标。

看看GWT ShowCase:here

在DataGrid上,当您单击ShowFriends链接时,您将在父行下显示子项。

希望它有所帮助。 :)