Tree组件使用指南之三:定制SelectionListener

来源:互联网 发布:淘宝开书店需要的证书 编辑:程序博客网 时间:2024/06/14 14:43
运行环境: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的完整代码 
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

0 0
原创粉丝点击