2014-10-08 112 views
0

我使用的是Primefaces樹具有以下結構:獲取節點的索引在Primefaces樹

節點1

節點1.1

節點1.2

節點1.3

現在,我想在節點1.1和節點1.2之間添加一個節點。我可以通過使用「add(int index,TreeNode element)」方法來實現。但爲此,我必須知道節點1.1的索引。

有什麼辦法通過它的名字或任何其他方式獲得節點的索引?

+0

這是由REC ursion,它可能會非常昂貴,取決於您的數據集。 – kolossus 2014-10-09 00:33:01

回答

0

這是另一個例子,它提供了一種簡單的方法來將節點添加到特定節點的下面。

XHTML

<h:form> 
    <p:tree value="#{treeBasicView.root}" 
      id="tree" 
      var="node" 
      dynamic="true"> 
     <p:treeNode> 
      <h:outputText value="#{node}" /> 
     </p:treeNode> 
    </p:tree> 

    <p:outputLabel value="add node : " /> 
    <p:inputText id="newNodeName" 
       value="#{treeBasicView.newNodeName}"/> 

    <p:outputLabel value="below : " /> 
    <p:inputText id="selectedNodeName" 
       value="#{treeBasicView.selectedNodeName}"/> 
    <p:commandButton value="add child" 
        process="@this,newNodeName,selectedNodeName" 
        update="tree" 
        actionListener="#{treeBasicView.addNewNode}"/> 
</h:form> 

ManagedBean

@ManagedBean(name="treeBasicView") 
@ViewScoped 
public class BasicView implements Serializable { 

    private TreeNode root; 
    private TreeNode selectedNode; 
    private int position; 
    private String selectedNodeName; 
    private String newNodeName; 

    public TreeNode getRoot() { 
     return root; 
    } 

    public String getSelectedNodeName() { 
     return selectedNodeName; 
    } 

    public void setSelectedNodeName(String selectedNodeName) { 
     this.selectedNodeName = selectedNodeName; 
    } 

    public String getNewNodeName() { 
     return newNodeName; 
    } 

    public void setNewNodeName(String newNodeName) { 
     this.newNodeName = newNodeName; 
    } 

    @PostConstruct 
    public void init() { 
     root = new DefaultTreeNode("Root", null); 
     TreeNode node0 = new DefaultTreeNode("Node 0", root); 
     TreeNode node1 = new DefaultTreeNode("Node 1", 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); 

     node1.getChildren().add(new DefaultTreeNode("Node 1.1")); 
     node00.getChildren().add(new DefaultTreeNode("Node 0.0.0")); 
     node00.getChildren().add(new DefaultTreeNode("Node 0.0.1")); 
     node01.getChildren().add(new DefaultTreeNode("Node 0.1.0")); 
     node10.getChildren().add(new DefaultTreeNode("Node 1.0.0")); 
     root.getChildren().add(new DefaultTreeNode("Node 2")); 
    } 

    public void addNewNode(ActionEvent event) { 
     findNode(root); 
     selectedNode.getParent().getChildren().add(position, new DefaultTreeNode(newNodeName)); 
    } 

    private void findNode(TreeNode node){ 
     int pos = 0; 
     List<TreeNode> subChild = node.getChildren(); 
     for (TreeNode treeNode : subChild) { 
      pos = pos + 1; 
      if(treeNode.getData().equals(selectedNodeName)){ 
       position = pos; 
       selectedNode = treeNode; 
      } 
      findNode(treeNode); 
     } 
    } 
} 

Figure 1

後點擊添加子

Figure 2

2

這是我的例子,它提供了一種簡單的方法來在特定節點內添加現在的節點。

XHTML

<h:form> 
    <p:tree value="#{treeBasicView.root}" 
      id="tree" 
      var="node" 
      dynamic="true"> 
     <p:treeNode> 
      <h:outputText value="#{node}" /> 
     </p:treeNode> 
    </p:tree> 

    <p:outputLabel value="add node : " /> 
    <p:inputText id="newNodeName" 
       value="#{treeBasicView.newNodeName}"/> 

    <p:outputLabel value="to into : " /> 
    <p:inputText id="selectedNodeName" 
       value="#{treeBasicView.selectedNodeName}"/> 
    <p:commandButton value="add child" 
        process="@this,newNodeName,selectedNodeName" 
        update="tree" 
        actionListener="#{treeBasicView.addNewNode}"/> 
</h:form> 

ManagedBean使用treeNode.getChildren().add(i, name)等添加子 Figure 3

你可以用這個例子應用

@ManagedBean(name = "treeBasicView") 
@ViewScoped 
public class BasicView implements Serializable { 

    private TreeNode root; 
    private String selectedNodeName; 
    private String newNodeName; 

    public TreeNode getRoot() { 
     return root; 
    } 

    public String getSelectedNodeName() { 
     return selectedNodeName; 
    } 

    public void setSelectedNodeName(String selectedNodeName) { 
     this.selectedNodeName = selectedNodeName; 
    } 

    public String getNewNodeName() { 
     return newNodeName; 
    } 

    public void setNewNodeName(String newNodeName) { 
     this.newNodeName = newNodeName; 
    } 

    @PostConstruct 
    public void init() { 
     root = new DefaultTreeNode("Root", null); 
     TreeNode node0 = new DefaultTreeNode("Node 0", root); 
     TreeNode node1 = new DefaultTreeNode("Node 1", 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); 

     node1.getChildren().add(new DefaultTreeNode("Node 1.1")); 
     node00.getChildren().add(new DefaultTreeNode("Node 0.0.0")); 
     node00.getChildren().add(new DefaultTreeNode("Node 0.0.1")); 
     node01.getChildren().add(new DefaultTreeNode("Node 0.1.0")); 
     node10.getChildren().add(new DefaultTreeNode("Node 1.0.0")); 
     root.getChildren().add(new DefaultTreeNode("Node 2")); 
    } 

    public void addNewNode(ActionEvent event) { 
     findNode(root); 
    } 

    private void findNode(TreeNode node){ 
     List<TreeNode> subChild = node.getChildren(); 
     for (TreeNode treeNode : subChild) { 
      if(treeNode.getData().equals(selectedNodeName)){ 
       treeNode.getChildren().add(new DefaultTreeNode(newNodeName)); 
       break; 
      } 
      findNode(treeNode); 
     } 
    } 
} 

Figure 1

後點擊。