Jsf 选择childs时未选择Primefaces树顶部父节点

Jsf 选择childs时未选择Primefaces树顶部父节点,jsf,jsf-2,primefaces,tree,Jsf,Jsf 2,Primefaces,Tree,我从以下几个方面来举这个例子: public TreeCheckboxBean(){ root2=新的CheckboxTreeNode(“Root”,null); TreeNode0=新的CheckboxTreeNode(“节点0”,根2); TreeNode1=新的CheckboxTreeNode(“节点1”,根节点2); TreeNode node2=新的CheckboxTreeNode(“节点2”,root2); TreeNode0=新的CheckboxTreeNode(“节点0.0”,n

我从以下几个方面来举这个例子:

public TreeCheckboxBean(){
root2=新的CheckboxTreeNode(“Root”,null);
TreeNode0=新的CheckboxTreeNode(“节点0”,根2);
TreeNode1=新的CheckboxTreeNode(“节点1”,根节点2);
TreeNode node2=新的CheckboxTreeNode(“节点2”,root2);
TreeNode0=新的CheckboxTreeNode(“节点0.0”,node0);
TreeNode01=新的CheckboxTreeNode(“节点0.1”,节点0);
TreeNode10=新的CheckboxTreeNode(“节点1.0”,节点1);
TreeNode11=新的CheckboxTreeNode(“节点1.1”,节点1);
TreeNode000=新的CheckboxTreeNode(“节点0.0.0”,节点00);
TreeNode001=新的CheckboxTreeNode(“节点0.0.1”,节点00);
TreeNode010=新的CheckboxTreeNode(“节点0.1.0”,节点01);
TreeNode100=新的CheckboxTreeNode(“节点1.0.0”,节点10);
}
公共树节点[]getSelectedNodes(){
返回所选节点;
}  
public void setSelectedNodes(TreeNode[]selectedNodes){
this.selectedNodes=selectedNodes;
}  
public void displayedSelectedMultiple(){
如果(selectedNodes!=null&&selectedNodes.length>0){
StringBuilder=新的StringBuilder();
对于(TreeNode节点:selectedNodes){
append(node.getData().toString());
builder.append(“
”); } FacesMessage=新的FacesMessage(FacesMessage.SEVERITY_INFO,“Selected”,builder.toString()); FacesContext.getCurrentInstance().addMessage(空,消息); } }
从那里我检查子节点0.1、节点0.1.0、节点1.1。当我单击DisplaySelected按钮时,通知仅显示上面的节点为selected

是否有任何方法可以将节点0和节点1也包括在所选范围内

因此它将成为节点0、节点0.1、节点0.1.0、节点1、节点1.1


仅供参考:我使用的是PrimeFaces4,JSF2.1.26。

我认为您必须在后台bean中自己完成

Collection<TreeNode> selectedNodes2 = new ArrayList<>();
for(TreeNode node : selectedNodes) {
    selectedNodes2.add(node);
    while (node.getParent()!=null){
        selectedNodes2.add(node.getParent());
        node = node.getParent();
    }
}
Collection selectedNodes2=new ArrayList();
用于(TreeNode节点:selectedNodes){
选择节点2.添加(节点);
while(node.getParent()!=null){
selectedNodes2.add(node.getParent());
node=node.getParent();
}
}
你可以用
node.setSelected(true)
如果您想实际选择节点。

如果您想使用任何策略(而不是全部)将选择传播到父节点,则必须实现事件侦听器

<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 void setSelectedTreeNode(字符串名称){
列表树=root.getChildren();
findNode(名称、树);
}
私有void findNode(字符串名称、列表树){
for(TreeNode节点:树){
if(node.getData().toString()包含(名称)){
setSelectedNode(节点);
打破
}
findNode(name,node.getChildren());
}
}

您必须使用递归方法,上面的示例将对您有所帮助。

谢谢,这确实给了我一个想法:)在这里和那里进行了一些调整之后,将节点从子节点迭代到顶部父节点集selected=true,就行了。只需附加信息,使用此方法,您仍然需要刷新/更新树组件本身。谢谢:)
<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);
        }
    }  
}
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());
    }
}