Как создать динамическое дерево? - PullRequest
0 голосов
/ 12 июля 2011

У меня возникли проблемы с реализацией динамической древовидной структуры с использованием реализации простого дерева. В демонстрации, предоставленной Primeface, структура кода выглядит следующим образом. Это, однако, очень статично. Я пытаюсь выяснить, как я мог бы сделать это с данными, полученными из базы данных, где глубина дерева была бы неизвестна во время компиляции.

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

Есть мысли?

Ниже приведен пример кода от простых лиц

private TreeNode root;
private TreeNode selectedNode;

public TreeBean() {
    root = new DefaultTreeNode("Root", null);
    TreeNode node0 = new DefaultTreeNode("Node 0", root);
    TreeNode node1 = new DefaultTreeNode("Node 1", root);
    TreeNode node2 = new DefaultTreeNode("Node 2", root);

    TreeNode node00 = new DefaultTreeNode("Node 0.0", node0);
    TreeNode node01 = new DefaultTreeNode("Node 0.1", node0);

    TreeNode node10 = new DefaultTreeNode("Node 1.0", node1);
    TreeNode node11 = new DefaultTreeNode("Node 1.1", node1);

    TreeNode node000 = new DefaultTreeNode("Node 0.0.0", node00);
    TreeNode node001 = new DefaultTreeNode("Node 0.0.1", node00);
    TreeNode node010 = new DefaultTreeNode("Node 0.1.0", node01);

    TreeNode node100 = new DefaultTreeNode("Node 1.0.0", node10);
}

Ответы [ 2 ]

4 голосов
/ 12 июля 2011
private TreeNode root;

private TreeNode selectedNode;

public TreeBean() {
root = new DefaultTreeNode("Root", null);
List rootNodes<Employee> = SearchDao.getRootNodes();

Iterator it = rootNodes.iterator();
while (it.hasNext()) {

TreeNode node1 = new DefaultTreeNode(**it.next()**, root);
    **/* in place of it.next() I need to display empName. When I click on empName, I need to get the Id(Pkey). */**

}

}

public TreeNode getRoot() {
return root;
}

public TreeNode getSelectedNode() {
return selectedNode;
}

public void setSelectedNode(TreeNode selectedNode) {
this.selectedNode = selectedNode;
}



public void addChildNode(ActionEvent actionEvent) {
System.out.println("Selected Node: "+getSelectedNode().toString());
TreeNode newNode = new DefaultTreeNode("Node New", getSelectedNode());
getSelectedNode().setExpanded(true);
}
public void addTopicBelow(ActionEvent actionEvent){
TreeNode newNode = new DefaultTreeNode("Node New", getSelectedNode().getParent());
}
public void deleteNode(ActionEvent actionEvent){
 System.out.println("Node to be deleted: "+getSelectedNode().toString());
 //getSelectedNode().
}
3 голосов
/ 19 февраля 2014

Пример кода от Primefaces, на мой взгляд, очень статичен.У меня была та же проблема, и я понял это, создав один фиктивный дочерний узел для каждого родительского узла.При расширении родительского узла метод ' onNodeExpand ' удаляет фиктивный дочерний узел и добавляет реальные дочерние узлы.

<h:form id="form">
    <p:tree id="tree" value="#{treeController.root}" var="node" dynamic="true" cache="false">
        <p:ajax event="expand" listener="#{treeController.onNodeExpand}" />
        <p:treeNode>
            <h:outputText value="#{node}" />
        </p:treeNode>
    </p:tree>
</h:form>



package com.test.web;

import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
import org.primefaces.event.NodeExpandEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;

@Named(value = "treeController")
@SessionScoped
public class TreeController implements Serializable {

    private TreeNode root;

    @PostConstruct
    public void buildTree() {
        root = new DefaultTreeNode("Root", null);  
        createNode("Node 0", root);
        createNode("Node 1", root);
        createNode("Node 2", root);                        
    }

    public TreeNode getRoot() {
        return root;
    }

    public void setRoot(TreeNode root) {
        this.root = root;
    }

    public void onNodeExpand(NodeExpandEvent event) {  
         DefaultTreeNode parent = (DefaultTreeNode) event.getTreeNode();
         if (parent.getChildCount() == 1 && parent.getChildren().get(0).getData().toString().equals("DUMMY")) {
             parent.getChildren().remove(0);
             createNode("Node A", parent);
             createNode("Node B", parent);
             createNode("Node C", parent);
         }
    }

    private void createNode(String tag, TreeNode parent) {
        TreeNode node = new DefaultTreeNode(tag, parent); 
        // Create Dummy node, just to make the parent node expandable
        new DefaultTreeNode("DUMMY", node);
    }
}
...