PrimeFaces Tree组件,从托管bean设置选定节点

bar*_*on5 12 jsf primefaces

我在Glassfish 3上运行Primefaces 3.2和JSF 2.0.

我已经尝试了很多,以编程方式从托管bean中设置所选节点.这包括设置所选节点,如下所示:

public void setSelectedTreeNode(String name) {
TreeNode root = treeBean.getRoot();
List<TreeNode> tree = root.getChildren();
for(TreeNode node:tree) {
  if(node.getData().toString().contains(name)) {
    System.out.println("found the node to select");
    treeBean.setSelectedNode(node);
    break;
  }
}
RequestContext context = RequestContext.getCurrentInstance(); 
context.update(":navForm:treeSingle");
}
Run Code Online (Sandbox Code Playgroud)

"找到要选择的节点"将在终端中打印,但未在网页的树中选择节点.

树是这样的:

<h:form id="navForm">
<p:tree id="treeSingle" value="#{treeBean.root}" var="node"  
       selectionMode="single" styleClass="treeStyle" 
       selection="#{treeBean.selectedNode}"
       cache="false"
       >  
   <p:ajax event="select" listener="#{treeBean.onNodeSelect}" update=":mainForm" />
   <p:treeNode>  
       <h:outputText value="#{node}" escape="false" />  
   </p:treeNode>  
Run Code Online (Sandbox Code Playgroud)

编辑:TreeBean是这样构建的:

@ManagedBean
@SessionScoped    
public class TreeBean implements Serializable {  

private TreeNode root;  

private TreeNode selectedNode;  

public TreeBean() {  
    root = new DefaultTreeNode("Root", null);  
    TreeNode node0 = new DefaultTreeNode("Node 0", root);  
    TreeNode node1 = new DefaultTreeNode("Node 1", root);  
    TreeNode node2 = new DefaultTreeNode("Node 2", 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);  
    TreeNode node11 = new DefaultTreeNode("Node 1.1", node1);  

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

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

public TreeNode getRoot() {  
    return root;  
}  

public TreeNode getSelectedNode() {  
    return selectedNode;  
}  

public void setSelectedNode(TreeNode selectedNode) {  
    this.selectedNode = selectedNode;  
}  
}
Run Code Online (Sandbox Code Playgroud)

有没有人知道如何做到这一点?

小智 14

我解决了它:

node.setSelected(true);
Run Code Online (Sandbox Code Playgroud)

我发现选择节点不足以使"树组件"从根节点扩展到选定节点.

为此,我使用了以下方法.在视图上:

 <p:ajax event="expand" listener="#{tree.onExpand}"/>
Run Code Online (Sandbox Code Playgroud)

在java代码上:

public void onExpand(NodeExpandEvent event) {
    expand(event.getTreeNode());
}

private void expand(TreeNode treeNode){
    if (treeNode.getParent()!=null){
        treeNode.getParent().setExpanded(true);
        expand(treeNode.getParent());
    }
}
Run Code Online (Sandbox Code Playgroud)


Ali*_*Ali 5

对我来说,以上都没有奏效。因为从我在控制台中看到的内容来看,子节点没有任何 id,更不用说任何行键号了,所以我在 rowKey 属性的帮助下使用了 jQuery 高级类选择器,所以我不得不使用

String script = "PF('treeSingleWidget').selectNode($(\"td[data-rowkey='" + selectedNode.getRowKey() + "']\"))";
Primefaces.current().executeScript(script);
Run Code Online (Sandbox Code Playgroud)


Tim*_*yer 1

在上面的if语句中,当 true 时,执行node.setSelected(true);

我用它来根据需要设置节点。反过来显然有相反的效果;它会关闭它们。我的用例是一个布尔复选框,用于打开或关闭所有节点,因为我有相当多的节点沿着树的一侧运行。因此,我的实际代码涉及一些方法,是:-

public Boolean getSelectionState() {
    return selectionState;
}

public void setSelectionState(Boolean selectionState) {
    this.selectionState = selectionState;
}

public String getSelectLabel() {
    return selectionState ? "De-select all" : "Select all";
}

/**
 * Flips all nodes on or off depending on checkbox.
 */
public void onSelectChange() {
    if (prefs.isDebug()) {
        LOG.log(Level.INFO, "Value change event occured. Selection state is:{0}", selectionState);
    }
    for (TreeNode node : rootNode.getChildren()) {
        node.setSelected(selectionState);
    }
    nodes = new ArrayList(rootNode.getChildren());
    selectedNodes = nodes.toArray(new TreeNode[nodes.size()]);
    mapDevices();
}
Run Code Online (Sandbox Code Playgroud)

然而,我在 GF 3 上的 JSF 2 上使用 3.4。我不知道是否有区别。

法规

蒂姆