Primefaces选择子项时未选择树顶部父节点

时间:2014-01-09 08:38:28

标签: jsf jsf-2 primefaces tree

我从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。

2 个答案:

答案 0 :(得分:4)

我认为你必须自己在支持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)可以根据需要实际选择节点。

答案 1 :(得分:0)

如果你想使用任何策略(而不是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);
        }
    }  
}

未经测试,但您明白了这一点:)

相关问题