Пример дерева динамической иерархии JSF / ICEfaces - PullRequest
1 голос
/ 17 ноября 2011

у меня есть список отделов , и у каждого отдела может быть родитель или не , объект домена отдела выглядит следующим образом:

- 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 , находящийся под root, может иметь дочерние узлы B, C, D и D , например, child узлы и т. д.

поэтому я подумываю о том, как сделать что-то подобное, мне нужен пример кода или подсказки, если кто-то может помочь.

Ответы [ 3 ]

1 голос
/ 18 ноября 2011

Вам понадобится рекурсивный метод для построения дерева из вашей модели.

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 и станет родителем.

0 голосов
/ 15 марта 2012

Чек http://click.avoka.com/click-examples/tree/checkbox-tree-page.htm

Последнее делается через платформу Apache Click. Сейчас я разрабатываю проект, в котором интенсивно используется эта структура данных (дерево иерархии). Вы можете установить корневой узел или, если вам нужно иметь несколько начальных точек, вы можете создать подстановочный корневой узел, который не повлияет на функциональность, подклассы, как прокомментировали другие, должны создаваться рекурсивно.

0 голосов
/ 22 ноября 2011

наконец я смог сделать это следующим образом:

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