2014-10-08 6 views
0

Я использую дерево Primefaces, который имеет следующую структуру:Получить индекс узла в Primefaces Tree

Узел 1

Узел 1.1

Узел 1.2

Узел 1.3

Теперь я хочу добавить узел между узлами 1.1 и узлом 1.2. Я могу это сделать, используя метод «add (int index, TreeNode element)». Но для этого я должен знать индекс узла 1.1.

Есть ли способ получить индекс узла по его названию или любым другим способом?

+0

Это РЭЦ ursion, и это может стать довольно дорогостоящим, в зависимости от вашего набора данных. – kolossus

ответ

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

@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

После клика добавить ребенка Figure 3

Вы можете применить этот пример, используя treeNode.getChildren().add(i, name) и так далее.

Смежные вопросы