JSF / ICEfaces动态层次结构树示例

时间:2011-11-17 16:35:17

标签: java java-ee tree icefaces

我有部门列表,每个部门可能有,部门域对象是如下:

- departmentId
- parentDepartmentId (null if current department has no parent i,e should be under root directly, and have value if current department have parent).
.
.
.

查看用于创建基本树的icefaces教程代码:

// create root node with its children expanded
    DefaultMutableTreeNode rootTreeNode = new DefaultMutableTreeNode();
    IceUserObject rootObject = new IceUserObject(rootTreeNode);
    rootObject.setText("Root Node");
    rootObject.setExpanded(true);
    rootTreeNode.setUserObject(rootObject);

    // model is accessed by by the ice:tree component via a getter method, this object is what's needed in the view to display the tree
    model = new DefaultTreeModel(rootTreeNode);

    // add some child nodes
    for (int i = 0; i <3; i++) {
        DefaultMutableTreeNode branchNode = new DefaultMutableTreeNode();
        IceUserObject branchObject = new IceUserObject(branchNode);
        branchObject.setText("node-" + i);
        branchNode.setUserObject(branchObject);
        rootTreeNode.add(branchNode);
    }

所有这些都是关于构建基本节点和添加子节点。

我的情况很复杂,孩子A 在根目录下可能有子节点B,C,D D 例如< strong>子节点等等。

所以我正在考虑如何完成这样的事情的最佳实践,我需要一个示例代码或提示,如果有人可以提供帮助。

3 个答案:

答案 0 :(得分:1)

您需要一个递归方法来从模型构造树。

public void buildRecursiveTreeNode(DefaultMutableTreeNode parentTreeNode,
            String treeId, String treeName, GenericTreeVo modelVo) 
    {
            // if the database model contains more children. 
            // add the current nodes first and pass in this nodes tree id and name to construct the children for this parent nodes.


    }

更新了包含递归示例的答案。

http://www.danzig.us/java_class/recursion.html

刚刚添加了一个递归链接,我要说的是当你从数据库中迭代数据时,你会看到你是否有任何子记录,如果你有子记录,你会通过传递DefaultMutableTreeNode来调用相同的方法会成为父母。

答案 1 :(得分:0)

最后我能够做到如下:

List<Department> departmentList = getAllDepartments();
            // create root node with its children expanded
            DefaultMutableTreeNode rootTreeNode = new DefaultMutableTreeNode();
            IceUserObject rootObject = new IceUserObject(rootTreeNode);
            rootObject.setText("Root");
            rootObject.setExpanded(true); 
            rootTreeNode.setUserObject(rootObject);

            HashMap<Department, DefaultMutableTreeNode> createdNodesMap = new HashMap<Department, DefaultMutableTreeNode>(
                    0);

            for (Department department : departmentList) {

                DefaultMutableTreeNode currentNode = null;

                if (createdNodesMap.get(department) == null) {
                    log.debug("############ CREATING NODE "
                            + department.getName());
                    currentNode = new DefaultMutableTreeNode();
                    IceUserObject currentObject = new IceUserObject(currentNode);
                    currentObject.setText(department.getName());
                    currentObject.setExpanded(true);
                    currentNode.setUserObject(currentObject);

                    if (department.getParentDepartment() == null) {
                        rootTreeNode.add(currentNode);
                        log.debug("######### NODE " + department.getName()
                                + " ADDED UNDER ROOT");
                    }

                    createdNodesMap.put(department, currentNode);
                } else {
                    log.debug("############ GETTING CREATED NODE "
                            + department.getName());
                    currentNode = createdNodesMap.get(department);
                }

                if (department.getChildren().size() > 0)
                    log.debug("############ NODE " + department.getName()
                            + " HAVE " + department.getChildren().size()
                            + " CHILDREN");
                else
                    log.debug("############ NODE " + department.getName()
                            + " DOES NOT HAVE CHILDREN");

                for (Department department2 : department.getChildren()) {

                    log.debug("############ CREATING CHILD "
                            + department2.getName() + " FOR PARENT "
                            + department.getName());
                    DefaultMutableTreeNode branchNode;
                    if (createdNodesMap.get(department2) == null) {
                        branchNode = new DefaultMutableTreeNode();
                        IceUserObject branchObject = new IceUserObject(
                                branchNode);
                        branchObject.setText(department2.getName());
                        branchObject.setExpanded(true);
                        branchNode.setUserObject(branchObject);
                    } else
                        branchNode = createdNodesMap.get(department2);

                    createdNodesMap.put(department2, branchNode);
                    currentNode.add(branchNode);
                }

            }

            model = new DefaultTreeModel(rootTreeNode);

答案 2 :(得分:0)

检查http://click.avoka.com/click-examples/tree/checkbox-tree-page.htm

后者是通过Apache Click框架完成的。现在我正在开发一个大量使用这种数据结构(层次结构树)的项目。您可以设置根节点,或者如果需要有多个起点,可以创建一个不影响功能的通配符根节点,其他人已经注释了子类,需要递归创建。