PrimeFaces Tree component, setting selected node from managed bean

前端 未结 7 2278
南旧
南旧 2020-12-18 20:27

I\'m running Primefaces 3.2 and JSF 2.0 on Glassfish 3.

I\'ve tried a lot, to programatically set the selected node from a managed bean. That includes setting the se

相关标签:
7条回答
  • 2020-12-18 20:59

    I solved it using:

    node.setSelected(true);
    

    I discovered that selecting the node is not enough for the "tree component" to expand from root node to selected node.

    For this, I used the following approach. On the view :

     <p:ajax event="expand" listener="#{tree.onExpand}"/>
    

    on the java code:

    public void onExpand(NodeExpandEvent event) {
        expand(event.getTreeNode());
    }
    
    private void expand(TreeNode treeNode){
        if (treeNode.getParent()!=null){
            treeNode.getParent().setExpanded(true);
            expand(treeNode.getParent());
        }
    }
    
    0 讨论(0)
  • 2020-12-18 21:00

    I'm working with Primefaces 3.0 deployed in Glassfish 3.1 Build 43;

    The treeNode was or is selected automaticly with : myTreeNode.setSelected(true);

    Example :

     for (TreeNode m2:root.getChildren())   {
    
             if (((Menu) m2.getData()).getId() != null) {
    
                if (me.getId().equals(((Menu) m2.getData()).getId())) {
    
                                                m2.setSelected(true);
                                                break;
                                            }
                                        }
                                    }
    
    0 讨论(0)
  • 2020-12-18 21:02

    In the above if statement, when true, do a node.setSelected(true);

    I use that to set nodes on as required. The reverse obviously has the reverse effect; it turns them off. My use case has been a boolean check box to turn all nodes on or off as I have quite a few running down the side of a tree. My actual code, involving a few methods, is therefore:-

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

    I am however, using 3.4 on JSF 2 on GF 3. I don't know if there is a difference.

    Regs

    Tim

    0 讨论(0)
  • 2020-12-18 21:02

    please add node.setSelected(true) below treeBean.setSelectedNode(node); and it should work.

    0 讨论(0)
  • 2020-12-18 21:13

    To highlight selected tree node on client side from backing bean call selectNode() method on tree widget component.

    First, set widget var attribute to jsf tree component:

    <p:tree id="treeSingle" widgetVar="treeSingleWidget"
    

    Than you can test it from browser console:

    PrimeFaces.widgets.treeSingleWidget.selectNode($("#treeSingle\\:1"), true);
    

    First method argument represents node jquery object which was obtained by it`s id(colon symbol must be escaped by two backslashes). If second parameter set to false then node selection event will be fired.

    Finally, make javascript call from backing bean:

    StringBuilder sb = new StringBuilder();
        sb.append("PrimeFaces.widgets.treeSingleWidget.selectNode(");
        sb.append("$(\"#treeSingle\\\\:");
        sb.append(selectedNode.getRowKey());
        sb.append("\")");
        sb.append(", true)");
        RequestContext.getCurrentInstance().execute(sb.toString());
    

    P.S. to discover component js api type in browser console

    PrimeFaces.widget.VerticalTree.prototype
    
    0 讨论(0)
  • 2020-12-18 21:13

    for me none of the above worked. because from what I see in the console, the child nodes don't have any ids let alone any row key number so I used jQuery advanced class selector with the help of the rowKey attribute so I had to use

    String script = "PF('treeSingleWidget').selectNode($(\"td[data-rowkey='" + selectedNode.getRowKey() + "']\"))";
    Primefaces.current().executeScript(script);
    
    0 讨论(0)
提交回复
热议问题