【问题标题】:Primefaces Tree top parent node not selected when childs is selected选择子项时未选择 Primefaces 树顶部父节点
【发布时间】:2014-01-09 08:38:27
【问题描述】:

这个例子我取自Primefaces Showcase Tree Checkbox Selection:

public TreeCheckboxBean() {  
    root2 = new CheckboxTreeNode("Root", null);  
    TreeNode node0 = new CheckboxTreeNode("Node 0", root2);  
    TreeNode node1 = new CheckboxTreeNode("Node 1", root2);  
    TreeNode node2 = new CheckboxTreeNode("Node 2", root2);  

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

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

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

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

public TreeNode[] getSelectedNodes() {  
    return selectedNodes;  
}  

public void setSelectedNodes(TreeNode[] selectedNodes) {  
    this.selectedNodes = selectedNodes;  
}  

public void displaySelectedMultiple() {  
    if(selectedNodes != null && selectedNodes.length > 0) {  
        StringBuilder builder = new StringBuilder();  

        for(TreeNode node : selectedNodes) {  
            builder.append(node.getData().toString());  
            builder.append("<br />");  
        }  

        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Selected", builder.toString());  

        FacesContext.getCurrentInstance().addMessage(null, message);  
    }  
}  

从那里我检查子节点 0.1、节点 0.1.0、节点 1.1。当我点击显示选定按钮时,通知只显示上面的节点被选中。

有什么方法可以将节点 0 和节点 1 也包括在内?

所以会变成节点0,节点0.1,节点0.1.0,节点1,节点1.1

仅供参考:我使用的是 Primefaces 4,JSF 2.1.26。

【问题讨论】:

    标签: jsf jsf-2 primefaces tree


    【解决方案1】:

    我认为你必须在 backing bean 中自己做。

    Collection<TreeNode> selectedNodes2 = new ArrayList<>();
    for(TreeNode node : selectedNodes) {
        selectedNodes2.add(node);
        while (node.getParent()!=null){
            selectedNodes2.add(node.getParent());
            node = node.getParent();
        }
    }
    

    你可以使用 node.setSelected(true) 可以根据需要实际选择节点。

    【讨论】:

    • 经过这里和那里的一些调整,从子节点到顶部父集的迭代节点选择 = true,正在工作。只是附加信息,使用这种方法,您仍然需要刷新/更新树组件本身。谢谢:)
    【解决方案2】:
    public void setSelectedTreeNode(String name) {
        List<TreeNode> tree = root.getChildren();
        findNode(name, tree);
    }
    
    private void findNode(String name, List<TreeNode> tree) {
        for (TreeNode node : tree) {
            if (node.getData().toString().contains(name)) {
                setSelectedNode(node);
                break;
            }
            findNode(name, node.getChildren());
        }
    }
    

    你必须使用递归方法,上面的例子会帮助你。

    【讨论】:

      【解决方案3】:

      如果您想使用 ANY 策略(而不是 ALL)将选择传播给父母,您必须实现事件侦听器。

      <p:tree value="#{treeCheckboxBean.root2}" var="node"  
              selectionMode="checkbox"  
              selection="#{treeCheckboxBean.selectedNodes}">   
      
          <p:ajax event="select" listener="#{treeBean.onNodeSelect}" />  
      
          <p:treeNode>  
              <h:outputText value="#{node}" />  
          </p:treeNode>  
      </p:tree>  
      

      和

      public class TreeBean implements Serializable 
      {  
                  private TreeNode[] selectedNodes; 
      
          ...
      
          public void onNodeSelect(NodeSelectEvent event) 
          {  
              for(TreeNode node = event.getTreeNode(); node != null; node = node.getParent())
              {
                  node.setSelected(true);
                  ArrayUtils.add(selectedNodes, node);
              }
          }  
      }
      

      没有测试,但你明白了:)

      【讨论】:

      • 谢谢,这真的给了我一个想法:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-29
      • 1970-01-01
      相关资源
      最近更新 更多