2011-07-12 22 views
0

primefacesツリー実装を使用して動的なツリー構造を実装する際に問題があります。 primefaceが提供するショーケースでは、コードの構造は以下のようになります。しかし、これは非常に静的です。私は、コンパイル時にツリーの深さが不明なデータベースからフェッチされたデータを使って、これをどのように行うことができるかを調べようとしています。ダイナミックツリーの作成方法は?

私は、これを実装するために再帰的な方法が必要だと思っていますが、実装がどのように見えるかを頭に考えることはできません。

どのような考えですか?以下は

はPrimefacesからのサンプルコードは、あまりにも私の意見では非常に静的である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

あなたの問題は何ですか?再帰的なメソッドは必要ありません。結果セットを繰り返し処理し、現在のノードを追跡し、そのノードまたはその親ノードなどにレコードの内容に応じて追加します。 – Jacob

答えて

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

または[リンク](http://www.primefaces.org/showcase/ui/treeSelectionAjax.jsf) –

+0

私は正しい方向に私を指してくれてありがとう、自分自身を見つけたはずです!なんらかの理由で、すべてのノードを一度に読み込むことになりましたが、これは必ずしもそうではありません。 – Daniel

3

からのコード例です。私は同じ問題を抱えていて、親ノードごとに1つのダミーの子ノードを作成することでそれを理解しました。親ノードを拡張する場合、メソッド '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); 
    } 
} 
関連する問題