2012年6月12日星期二

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

运行环境: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

2 条评论:

Unknown 说...
此评论已被作者删除。
匿名 说...

现在项目都找不到下载地方了,能提供一下吗,我想要里面JSFUtils和ADFUtils