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
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());
}
}
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;
}
}
}
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
please add node.setSelected(true)
below treeBean.setSelectedNode(node);
and it should work.
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
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);