【问题标题】:JSF/ICEfaces Dynamic hierarchy tree exampleJSF/ICEfaces 动态层次树示例
【发布时间】:2011-11-17 16:35:16
【问题描述】:

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

- 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);
    }

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

我的情况很复杂,根目录下的 child A 可能有子 节点 B、C、DD 例如 子节点等等。

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

【问题讨论】:

  • 在上面的代码中,如果这是一个方法,并且如果数据库中的数据有更多的子记录,那么您将在同一方法中递归调用该方法,这将构建您的树。跨度>
  • 请给你代码,还不能给你。

标签: java jakarta-ee tree icefaces


【解决方案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 来调用相同的方法将成为父母。

【讨论】:

  • 您能否根据您输入的部门列表添加更多细节,每个部门包含部门ID和父部门ID(部门ID的外键,即内部键)
【解决方案2】:

最后我能够做到以下几点:

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);

【讨论】:

  • 谁投反对票,他能分享一下原因吗?
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2011-12-19
    • 2011-07-22
    • 2021-01-30
    • 2012-10-13
    • 2013-03-03
    相关资源
    最近更新 更多