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());
}
}