2011-07-12 4 views
0

J'ai du mal à implémenter une structure arborescente dynamique en utilisant l'implémentation de l'arborescence primefaces. Dans la vitrine fournie par premierface, la structure du code est comme ci-dessous. Ceci est cependant très statique. J'essaie de comprendre comment je pourrais le faire avec des données extraites d'une base de données, où la profondeur de l'arbre serait inconnue au moment de la compilation. Je pense que j'ai probablement besoin d'une méthode récursive pour l'implémenter, mais je n'arrive pas à comprendre à quoi ressemblerait l'implémentation.Comment créer un arbre dynamique?

Des pensées?

Ci-dessous le code exemple de primefaces

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

Quel est exactement votre problème? Vous n'avez pas besoin d'une méthode récursive, vous parcourez simplement le ResultSet, gardez une trace du nœud actuel et ajoutez-le à ce nœud, ou à son parent, etc. selon ce que dit l'enregistrement. – Jacob

Répondre

4
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(). 
} 
+0

ou vous pouvez visiter [link] (http://www.primefaces.org/showcase/ui/treeSelectionAjax.jsf) –

+0

Merci de m'indiquer dans la bonne direction, aurait dû me trouver! Pour une raison quelconque, j'ai zoomé sur le chargement de tous les nœuds à la fois, ce qui n'est pas nécessaire. – Daniel

3

Le code exemple de Primefaces est très statique à mon avis aussi. J'ai eu le même problème et je l'ai compris en créant un nœud enfant fictif pour chaque nœud parent. Lors de l'expansion du noeud parent, la méthode 'onNodeExpand' supprime le noeud enfant fictif et ajoute des noeuds enfants réels.

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