The blog for hints & tips about Oracle Application Development Framework and Mobile Application Framework

  • ADFv
    November 22, 2011

How-to read data from selected tree node

Frank Nimphius
Master Principal Product Manager

By default, the SelectionListener
property of an ADF bound tree points to the makeCurrent method of the
class in ADF to synchronize the current row in the ADF
binding layer with the selected tree node. To customize the selection behavior,
or just to read the selected node value in Java, you override the default
configuration with an EL string pointing to a managed bean method property. In
the following I show how you change the selection listener while preserving the
default ADF selection behavior.

To change the SelectionListener,
select the tree component in the Structure Window and open the Oracle
JDeveloper Property Inspector. From the context menu, select the Edit option to create a new listener method
in a new or an existing managed bean.

For this example, I created a new managed bean. On tree node select, the managed bean code prints the selected
tree node value(s)

import java.util.List;

import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.el.MethodExpression;
import javax.faces.application.Application;
import javax.faces.context.FacesContext;
import java.util.Iterator;
import oracle.adf.view.rich.component.rich.data.RichTree;
import oracle.jbo.Row;
import oracle.jbo.uicli.binding.JUCtrlHierBinding;
import oracle.jbo.uicli.binding.JUCtrlHierNodeBinding;
import org.apache.myfaces.trinidad.event.SelectionEvent;
import org.apache.myfaces.trinidad.model.CollectionModel;
import org.apache.myfaces.trinidad.model.RowKeySet;
import org.apache.myfaces.trinidad.model.TreeModel;
public class TreeSampleBean {public TreeSampleBean() {}
 public void onTreeSelect(SelectionEvent selectionEvent) { //original selection listener set by ADF //#{bindings.allDepartments.treeModel.makeCurrent} String adfSelectionListener = "#{bindings.allDepartments.treeModel.makeCurrent}";
  //make sure the default selection listener functionality is  //preserved. you don't need to do this for multi select trees  //as the ADF binding only supports single current row selection  
/* START PRESERVER DEFAULT ADF SELECT BEHAVIOR */ FacesContext fctx = FacesContext.getCurrentInstance(); Application application = fctx.getApplication(); ELContext elCtx = fctx.getELContext(); ExpressionFactory exprFactory = application.getExpressionFactory();
  MethodExpression me = null;
  me = exprFactory.createMethodExpression(elCtx, adfSelectionListener,
                                          Object.class, newClass[]{SelectionEvent.class});

  me.invoke(elCtx, new Object[] { selectionEvent });  
  RichTree tree = (RichTree)selectionEvent.getSource(); TreeModel model = (TreeModel)tree.getValue(); 
//get selected nodes RowKeySet rowKeySet = selectionEvent.getAddedSet();
  Iterator rksIterator = rowKeySet.iterator();
  //for single select configurations,this only is called once
while (rksIterator.hasNext()) {
    List key = (List)rksIterator.next();
    JUCtrlHierBinding treeBinding = null;
    CollectionModel collectionModel = (CollectionModel)tree.getValue();
    treeBinding = (JUCtrlHierBinding)collectionModel.getWrappedData();
    JUCtrlHierNodeBinding nodeBinding = null;
    nodeBinding = treeBinding.findNodeByKeyPath(key);
    Row rw = nodeBinding.getRow();
    //print first row attribute. Note that in a tree you have to 
    //determine the node type if you want to select node attributes
//by name and not index 
    String rowType = rw.getStructureDef().getDefName();
     System.out.println("This row is a department: " +
    else if(rowType.equalsIgnoreCase("EmployeesView")){
     System.out.println("This row is an employee: " +
    // ... do more useful stuff here   



Download JDeveloper Sample Workspace


Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.