接上一篇 《ADF组件之 SelectBooleanCheckbox使用(用于查询Form)》
介绍
本篇文章主要描述如何在ADF table中使用SelectBooleanCheckbox组件,主要过程由java代码实现,当然还有其它方法。我们先看下实现效果:
1.数据库结果
2.ADF界面效果,选中一些记录后,提交
3.数据库结果
实现步骤:
1.创建CheckboxInTable类,此类是实现的关键之处,代码意思请参照注释
package view;
import java.io.Serializable;
import oracle.adf.view.rich.component.rich.data.RichTable;
import oracle.jbo.Row;
import oracle.jbo.uicli.binding.JUCtrlBoolBinding;
import oracle.jbo.uicli.binding.JUCtrlHierNodeBinding;
import org.apache.myfaces.trinidad.model.CollectionModel;
/**
* 将此类在taskflow文件中配置
* 如:
* <managed-bean id="__4">
* <managed-bean-name id="__3">EffectiveCheckboxBean</managed-bean-name>
* <managed-bean-class id="__1">view.CheckboxInTableBean</managed-bean-class>
* <managed-bean-scope id="__2">pageFlow</managed-bean-scope>
* <managed-property id="__6">
* <property-name id="__5">bindingExpr</property-name>
* <value id="__7">#{'#{bindings.Effective}'}</value>
* </managed-property>
* </managed-bean>
*/
public class CheckboxInTableBean implements Serializable {
/**
* 可以通过bindingExpr得到,也可以直接在taskflow中配置
* 如#{binding.Effective},但是必须保证#{binding.Effective}所处的scope和
* 此类在taskflow中配置的scope一致
*/
private transient JUCtrlBoolBinding binding;
/**
* 绑定ADF Table
* 如#{pageFlowScope.EffectiveCheckboxBean.table}
*/
private RichTable table;
/**
* 获取JUCtrlBoolBinding的表达式,在taskflow文件中配置
* 如:#{'#{binding.Effective}'},为什么不将#{binding.Effective}的值直接
* 配置给binding呢,原因是当在taskflow中配置的scope和#{binding.Effective}所处的scope不一致时,
* 将会报范围不一致的错误
*/
private String bindingExpr = null;
/**
* Checkbox选择的值,如 Y, YES, TRUE等,由用户定义
*/
private Object checkedValue;
/**
* Checkbox选择的值,如 N, NO, FALSE等,由用户定义
*/
private Object uncheckedValue;
public CheckboxInTableBean() {
super();
}
/**
* 更改Checkbox的值时调用此方法
*/
public void setValue(Object booleanValue) {
Object value = null;
if(booleanValue == Boolean.TRUE) {
value = checkedValue;
} else {
value = uncheckedValue;
}
String attribute = this.getBinding().getAttributeDef().getName();
if(table != null) {
CollectionModel model = (CollectionModel)table.getValue();
Object rowData = model.getRowData();
if (rowData instanceof JUCtrlHierNodeBinding) {
Row curTableRow = ((JUCtrlHierNodeBinding)rowData).getRow();
curTableRow.setAttribute(attribute, value);
}
}
}
/**
* 通过checkedValue和uncheckedValue获取正确的布尔值
* @return
*/
public Object getValue() {
String attribute = getBinding().getAttributeDef().getName();
if(table != null) {
CollectionModel model = (CollectionModel)table.getValue();
Object rowData = model.getRowData();
if (rowData instanceof JUCtrlHierNodeBinding) {
Object value =
((JUCtrlHierNodeBinding)rowData).getAttribute(attribute);
return checkedValue.equals(value) ? Boolean.TRUE : Boolean.FALSE;
}
}
return Boolean.FALSE;
}
public void setBinding(JUCtrlBoolBinding binding) {
this.binding = binding;
this.checkedValue = binding.getValueFromList(0);
this.uncheckedValue = binding.getValueFromList(1);
}
public JUCtrlBoolBinding getBinding() {
if(bindingExpr != null) {
return (JUCtrlBoolBinding)JSFUtils.resolveExpression(bindingExpr);
} else {
return binding;
}
}
public void setBindingExpr(String bindingExpr) {
this.bindingExpr = bindingExpr;
this.binding = this.getBinding();
this.checkedValue = this.binding.getValueFromList(0);
this.uncheckedValue = this.binding.getValueFromList(1);
}
public String getBindingExpr() {
return bindingExpr;
}
public void setTable(RichTable table) {
this.table = table;
}
public RichTable getTable() {
return table;
}
}
2.配置CheckboxInTable类到adfc-config.xml中
<?xml version="1.0" encoding="UTF-8" ?>
<adfc-config xmlns="http://xmlns.oracle.com/adf/controller" version="1.2">
<managed-bean id="__4">
<managed-bean-name id="__3">EffectiveCheckboxBean</managed-bean-name>
<managed-bean-class id="__1">view.CheckboxInTableBean</managed-bean-class>
<managed-bean-scope id="__2">pageFlow</managed-bean-scope>
<managed-property id="__6">
<property-name id="__5">bindingExpr</property-name>
<value id="__7">#{'#{bindings.Effective}'}</value>
</managed-property>
</managed-bean>
</adfc-config>
3. 创建ADF页面,这里只列出几个特别重要的地方
绑定ADF table #{pageFlowScope.EffectiveCheckboxBean.table}
将Checkbox的value设置为 #{pageFlowScope.EffectiveCheckboxBean.value}
pageDefs中的Effective的配置如下
<button IterBinding="CountriesView1Iterator" StaticList="true"
id="Effective">
<AttrNames>
<Item Value="Effective"/>
</AttrNames>
<ValueList>
<Item Value="Y"/>
<Item Value="N"/>
</ValueList>
</button>
运行,运行结果参照本文开头部分!
提示:在table中使用SelectBooleanCheckbox还可以通过在VO中创建一个临时字段,类型为Boolean,字段的值将有原始字段转换而来,如Y对应true,N对应false,同样在改变Checkbox的值时,也对应改变原始字段的值。
工程代码下载:http://download.csdn.net/detail/ygj26/4246577