运行环境:JDeveloper 11.1.2.2.0 + Oracle Database 10g Express Edition 10.2.0.1。
默认情况下,Tree组件的SelectionListener绑定的值型如:"#{bindings.DepartmentsView1.treeModel.makeCurrent}"。
实际场景中,可能需要在点击树节点时调用自己的逻辑,这时就需要定制SelectionListener。
把Selection Listener指向Managed Bean中的一个方法,比如:selectionListener="#{myBackingBean.treeSelectionListener}" 。
然后在该方法中用代码实现makeCurrent功能,并在其后加入自己的逻辑。
本实验前面的步骤和《 Tree组件使用指南之一:创建 》一样。以下只对重点步骤说明:
1. 修改Tree的Selection Listener,指向Managed Bean中的方法
2. Managed Bean的完整代码
3. 运行,输出如下
########################### rowType EmployeesView
########################### nodeStuctureDefname model.EmployeesView
########################### rowType DepartmentsView
########################### nodeStuctureDefname model.DepartmentsView
可以看出,点击不同的树节点时输出了每个节点的类型。
Project 下载: ADF_Tree_SelectionListener.7z
说明,本来想按照参考文献2写一个通用的treeSelectionListener,但是没有成功。
经过反复试验发现必须先要执行Tree原来绑定的SelectionListener,然后才可以调用自己的逻辑,否则findNodeByKeyPath(key)会返回Null。
参考文献:
1. https://blogs.oracle.com/jdevotnharvest/entry/how_to_read_data_from
默认情况下,Tree组件的SelectionListener绑定的值型如:"#{bindings.DepartmentsView1.treeModel.makeCurrent}"。
实际场景中,可能需要在点击树节点时调用自己的逻辑,这时就需要定制SelectionListener。
把Selection Listener指向Managed Bean中的一个方法,比如:selectionListener="#{myBackingBean.treeSelectionListener}" 。
然后在该方法中用代码实现makeCurrent功能,并在其后加入自己的逻辑。
本实验前面的步骤和《 Tree组件使用指南之一:创建 》一样。以下只对重点步骤说明:
1. 修改Tree的Selection Listener,指向Managed Bean中的方法
2. Managed Bean的完整代码
package view; import java.util.Iterator; import java.util.List; 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 oracle.jbo.uicli.binding.JUCtrlHierTypeBinding; import org.apache.myfaces.trinidad.event.SelectionEvent; import org.apache.myfaces.trinidad.model.CollectionModel; import org.apache.myfaces.trinidad.model.RowKeySet; import view.util.JSFUtils; public class MyBackingBean { public MyBackingBean() { } public void treeSelectionListener(SelectionEvent selectionEvent) { JSFUtils.invokeMethodExpression("#{bindings.DepartmentsView1.treeModel.makeCurrent}", Object.class, SelectionEvent.class, selectionEvent); RichTree tree = (RichTree)selectionEvent.getSource(); RowKeySet rowKeySet = selectionEvent.getAddedSet(); Iterator rksIterator = rowKeySet.iterator(); while (rksIterator.hasNext()) { List key = (List)rksIterator.next(); JUCtrlHierBinding treeBinding = null; CollectionModel collectionModel = (CollectionModel)tree.getValue(); treeBinding = (JUCtrlHierBinding)collectionModel.getWrappedData(); JUCtrlHierNodeBinding nodeBinding = treeBinding.findNodeByKeyPath(key); Row rw = nodeBinding.getRow(); String rowType = rw.getStructureDef().getDefName(); System.out.println("########################### rowType " + rowType); JUCtrlHierTypeBinding typeBinding = nodeBinding.getHierTypeBinding(); String nodeStuctureDefname = typeBinding.getStructureDefName(); System.out.println("########################### nodeStuctureDefname " + nodeStuctureDefname); } } }
3. 运行,输出如下
########################### rowType EmployeesView
########################### nodeStuctureDefname model.EmployeesView
########################### rowType DepartmentsView
########################### nodeStuctureDefname model.DepartmentsView
可以看出,点击不同的树节点时输出了每个节点的类型。
Project 下载: ADF_Tree_SelectionListener.7z
说明,本来想按照参考文献2写一个通用的treeSelectionListener,但是没有成功。
经过反复试验发现必须先要执行Tree原来绑定的SelectionListener,然后才可以调用自己的逻辑,否则findNodeByKeyPath(key)会返回Null。
参考文献:
1. https://blogs.oracle.com/jdevotnharvest/entry/how_to_read_data_from
2. http://www.oracle.com/technetwork/developer-tools/adf/learnmore/25-generic-tree-selection-listener-169164.pdf
http://maping930883.blogspot.com/2012/06/adf133treeselectionlistener.html