运行环境:JDeveloper 11.1.2.2.0 + Oracle Database 10g Express Edition 10.2.0.1。

本实验来自一个客户的真实需求。
由于种种原因,Table的列在设计时无法确定,因此只能在运行时通过程序动态创建Column。

案例1:Table的前两列固定不变, 其后的列不确定。

(1)页面代码

<af:table var="row" rowBandingInterval="0" id="t1" value="#{viewScope.useCase1MB.rowsData}" varStatus="vs"binding="#{viewScope.useCase1MB.useCase1Table}"><af:column sortable="true" sortProperty="#{row.id}" headerText="id" id="c1"><af:outputText value="#{row.id}" id="ot1"/></af:column><af:column sortable="true" sortProperty="#{row.name}" headerText="Name" id="c2"><af:outputText value="#{row.name}" id="ot2"/></af:column><af:forEach begin="0" end="#{viewScope.useCase1MB.numberOfColsToAdd}" varStatus="index"><af:column sortable="false" headerText="#{viewScope.useCase1MB.columnsHeader[index.current]}"id="c4"><af:outputText value="#{row.columnsData[index.current].cellValue}" id="ot4"/><f:facet name="header"><af:outputText value="#{viewScope.useCase1MB.columnsHeader[index.current]}" id="ot3"/></f:facet></af:column></af:forEach>
</af:table>

(2)Managed Bean代码

package view;import java.util.ArrayList;
import java.util.List;import model.type.usecase1.ColumnData;
import model.type.usecase1.RowData;import oracle.adf.model.BindingContext;
import oracle.adf.model.OperationBinding;
import oracle.adf.model.binding.DCBindingContainer;import oracle.adf.view.rich.component.rich.data.RichTable;import oracle.binding.BindingContainer;public class UseCase1ManagedBean {private RichTable useCase1Table;private List rowsData = new ArrayList();private int numberOfColsToAdd = 0;private List columnsHeader = new ArrayList();public UseCase1ManagedBean() {super();initData();}public BindingContainer getBindings() {return BindingContext.getCurrent().getCurrentBindingsEntry();}public void initData() {BindingContainer bindings = getBindings();oracle.binding.OperationBinding operationBinding = bindings.getOperationBinding("populateTableData");rowsData = (List)operationBinding.execute();for (int i = 0; i < rowsData.get(0).getColumnsData().size(); i++) {columnsHeader.add(rowsData.get(0).getColumnsData().get(i).getHeaderName());}if (rowsData.get(0).getColumnsData().size() > 0) {setNumberOfColsToAdd(rowsData.get(0).getColumnsData().size() - 1);}// useCase1Table.setColumnResizing("disabled");      }public void setRowsData(List rowsData) {this.rowsData = rowsData;}public List getRowsData() {return rowsData;}public void setNumberOfColsToAdd(int numberOfColsToAdd) {this.numberOfColsToAdd = numberOfColsToAdd;}public int getNumberOfColsToAdd() {return numberOfColsToAdd;}public void setColumnsHeader(List columnsName) {this.columnsHeader = columnsName;}public List getColumnsHeader() {return columnsHeader;}public void setUseCase1Table(RichTable useCase1Table) {this.useCase1Table = useCase1Table;}public RichTable getUseCase1Table() {return useCase1Table;}
}

(3)运行效果:
初始化Steve的数据,显示Steve's View:

初始化Mark的数据,显示Mark's View:

初始化Kim的数据,显示Kim's View:

案例2:每个Tab中有不确定的Table,每个Table中的列不确定。

(1)页面代码
<af:panelTabbed id="pt1" binding="#{viewScope.useCase2MB.panelTabbed}"/> 
(2)Managed Bean代码

package view;import java.util.ArrayList;
import java.util.List;import javax.el.ELContext;
import javax.el.ExpressionFactory;import javax.el.ValueExpression;import javax.faces.application.Application;
import javax.faces.component.UIComponent;import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;import javax.faces.event.PhaseId;import model.type.usecase2.ColumnData;
import model.type.usecase2.RowData;
import model.type.usecase2.TableData;
import model.type.usecase2.TabData;import oracle.adf.model.BindingContext;
import oracle.adf.view.rich.component.rich.RichForm;
import oracle.adf.view.rich.component.rich.data.RichColumn;
import oracle.adf.view.rich.component.rich.data.RichTable;
import oracle.adf.view.rich.component.rich.input.RichChooseDate;
import oracle.adf.view.rich.component.rich.input.RichInputDate;
import oracle.adf.view.rich.component.rich.input.RichInputListOfValues;
import oracle.adf.view.rich.component.rich.input.RichInputText;
import oracle.adf.view.rich.component.rich.layout.RichPanelTabbed;
import oracle.adf.view.rich.component.rich.layout.RichShowDetailItem;
import oracle.adf.view.rich.component.rich.output.RichOutputText;
import oracle.adf.view.rich.context.AdfFacesContext;import oracle.binding.BindingContainer;import view.util.JSFUtils;public class UseCase2ManagedBean {private RichTable useCase3Table;private List tabsData = new ArrayList();private RichPanelTabbed panelTabbed;public UseCase2ManagedBean() {super();}public BindingContainer getBindings() {return BindingContext.getCurrent().getCurrentBindingsEntry();}public void beforeRenderResponse(PhaseEvent phaseEvent) {if (phaseEvent.getPhaseId() == PhaseId.RENDER_RESPONSE) {FacesContext fctx = FacesContext.getCurrentInstance();AdfFacesContext adfFacesContext = AdfFacesContext.getCurrentInstance();boolean isInitialRender = adfFacesContext.isInitialRender();if (isInitialRender) {initTabsData();initTabsUI();}}}public void initTabsUI() {List panelTabbedChildren = panelTabbed.getChildren();for (int i = 0; i < tabsData.size(); i++) {RichShowDetailItem showDetailItem = new RichShowDetailItem();showDetailItem.setId("sdi" + (i + 1));showDetailItem.setText(tabsData.get(i).getTabName());List tablesData = tabsData.get(i).getTablesData();for (int j = 0; j < tablesData.size(); j++) {RichTable table = new RichTable();table.setId("t_" + (i + 1) + "_" + (j + 1));table.setVar("row");List rowsData = tablesData.get(j).getRowsData();table.setValue(rowsData);for (int k = 0; k < rowsData.get(0).getColumnsData().size(); k++) {RichColumn column = new RichColumn();column.setId("col_" + (i + 1) + "_" + (j + 1) + "_" + (k + 1));column.setSortable(false);column.setHeaderText(rowsData.get(0).getColumnsData().get(k).getHeaderName());RichOutputText outputText = new RichOutputText();outputText.setId("ot" + (i + 1) + "_" + (j + 1) + "_" + (k + 1));FacesContext fctx = FacesContext.getCurrentInstance();ELContext elctx = fctx.getELContext();Application jsfApp = fctx.getApplication();ExpressionFactory exprFactory = jsfApp.getExpressionFactory();ValueExpression valueExpr =exprFactory.createValueExpression(elctx, "#{row.columnsData[" + k + "].cellValue}",Object.class);outputText.setValueExpression("value", valueExpr);column.getChildren().add(outputText);table.getChildren().add(column);}RichOutputText outputText = new RichOutputText();outputText.setId("ot" + (i + 1) + "_" + (j + 1) );outputText.setValue(tablesData.get(j).getTableName());showDetailItem.getChildren().add(outputText);showDetailItem.getChildren().add(table);}panelTabbedChildren.add(showDetailItem);}}public void initTabsData() {BindingContainer bindings = getBindings();oracle.binding.OperationBinding operationBinding = bindings.getOperationBinding("populateTabsData");tabsData = (List)operationBinding.execute();}public void setUseCase3Table(RichTable useCase3Table) {this.useCase3Table = useCase3Table;}public RichTable getUseCase3Table() {return useCase3Table;}public void setPanelTabbed(RichPanelTabbed panelTabbed) {this.panelTabbed = panelTabbed;}public RichPanelTabbed getPanelTabbed() {return panelTabbed;}
}

(3)运行效果

案例3:Table的列不确定,且每个列的显示组件不同。

(1)页面代码
<af:table var="row" rowBandingInterval="0" id="t1" value="#{viewScope.useCase3MB.rowsData}" varStatus="vs"
binding="#{viewScope.useCase3MB.useCase3Table}"/>
(2)Managed Bean代码

package view;import java.util.ArrayList;
import java.util.List;import javax.el.ELContext;
import javax.el.ExpressionFactory;import javax.el.ValueExpression;import javax.faces.application.Application;
import javax.faces.component.UIComponent;import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;import javax.faces.event.PhaseId;import model.type.usecase3.ColumnData;
import model.type.usecase3.RowData;import oracle.adf.model.BindingContext;
import oracle.adf.view.rich.component.rich.RichForm;
import oracle.adf.view.rich.component.rich.data.RichColumn;
import oracle.adf.view.rich.component.rich.data.RichTable;
import oracle.adf.view.rich.component.rich.input.RichChooseDate;
import oracle.adf.view.rich.component.rich.input.RichInputDate;
import oracle.adf.view.rich.component.rich.input.RichInputListOfValues;
import oracle.adf.view.rich.component.rich.input.RichInputText;
import oracle.adf.view.rich.component.rich.output.RichOutputText;
import oracle.adf.view.rich.context.AdfFacesContext;import oracle.binding.BindingContainer;import view.util.JSFUtils;public class UseCase3ManagedBean {private RichTable useCase3Table;private List rowsData = new ArrayList();public UseCase3ManagedBean() {super();}public BindingContainer getBindings() {return BindingContext.getCurrent().getCurrentBindingsEntry();}public void beforeRenderResponse(PhaseEvent phaseEvent) {if (phaseEvent.getPhaseId() == PhaseId.RENDER_RESPONSE) {FacesContext fctx = FacesContext.getCurrentInstance();AdfFacesContext adfFacesContext = AdfFacesContext.getCurrentInstance();boolean isInitialRender = adfFacesContext.isInitialRender();if (isInitialRender) {initTableData();initTableUI();}}}public void initTableUI() {List tableChildren = useCase3Table.getChildren();for (int i = 0; i < rowsData.get(0).getColumnsData().size(); i++) {RichColumn column = new RichColumn();column.setId("col" + (i + 1));column.setSortable(false);column.setHeaderText(rowsData.get(0).getColumnsData().get(i).getHeaderName());FacesContext fctx = FacesContext.getCurrentInstance();ELContext elctx = fctx.getELContext();Application jsfApp = fctx.getApplication();ExpressionFactory exprFactory = jsfApp.getExpressionFactory();ValueExpression valueExpr =exprFactory.createValueExpression(elctx, "#{row.columnsData[" + i + "].cellValue}", Object.class);String columnType = rowsData.get(0).getColumnsData().get(i).getColumnType();if (columnType.equals("DATEBOX")) {                RichInputDate inputDate = new RichInputDate();inputDate.setId("cd" + (i + 1));inputDate.setValueExpression("value", valueExpr);column.getChildren().add(inputDate);} else if (columnType.equals("INPUT_POPUP")) {RichInputListOfValues inputLOV = new RichInputListOfValues();inputLOV.setId("ilov" + (i + 1));inputLOV.setValueExpression("value", valueExpr);column.getChildren().add(inputLOV);column.setWidth("120");} else if (columnType.equals("HIDDEN")) {RichOutputText outputText = new RichOutputText();outputText.setId("ot" + (i + 1));outputText.setValueExpression("value", valueExpr);column.getChildren().add(outputText);column.setVisible(false);} else if (columnType.equals("INPUT_TEXT")) {RichInputText inputText = new RichInputText();inputText.setId("it" + (i + 1));inputText.setValueExpression("value", valueExpr);column.getChildren().add(inputText);} else {RichOutputText outputText = new RichOutputText();outputText.setId("ot" + (i + 1));outputText.setValueExpression("value", valueExpr);column.getChildren().add(outputText);}tableChildren.add(column);}}public void initTableData() {BindingContainer bindings = getBindings();oracle.binding.OperationBinding operationBinding = bindings.getOperationBinding("populateTableData");rowsData = (List)operationBinding.execute();}public void setUseCase3Table(RichTable useCase3Table) {this.useCase3Table = useCase3Table;}public RichTable getUseCase3Table() {return useCase3Table;}public void setRowsData(List rowsData) {this.rowsData = rowsData;}public List getRowsData() {return rowsData;}
}

(3)运行效果

Project 下载:ADF_Table_Dynamic_Column.7z

http://maping930883.blogspot.com/2012/06/adf146table-column.html

Table 组件使用指南之十六:动态增加Column相关推荐

  1. 开发指南专题十六:JEECG微云快速开发平台Excel导出

    开发指南专题十六:JEECG微云快速开发平台Excel导出 14.3.  Excel导出 导出工具类ExcelExportUtil 提供两个函数 //创建多个Sheet public static H ...

  2. 游戏感:虚拟感觉的游戏设计师指南——第十六章 Raptor Safari

    这是一本游戏设计方面的好书 转自天:天之虹的博客:http://blog.sina.com.cn/jackiechueng 感谢天之虹的无私奉献 Word版可到本人的资源中下载 第十六章 Raptor ...

  3. 高速PCB设计指南(十六)

    第二篇  实现PCB高效自动布线的设计技巧和要点 尽管现在的EDA工具很强大,但随着PCB尺寸要求越来越小,器件密度越来越高,PCB设计的难度并不小.如何实现PCB高的布通率以及缩短设计时间呢?本文介 ...

  4. android开发菜单,Android学习指南之十六:Android菜单详解

    Android用户界面的组成除了View外,还包括菜单和对话框,本节我们先来学习一下菜单的使用方法. 菜单Menu是Android用户界面中最常见的元素之一,使用非常频繁.Android菜单主要分为三 ...

  5. Windows程式开发设计指南(十六)调色盘管理器

    16. 调色盘管理器 如果硬体允许,本章就没有存在的必要.尽管许多现代的显示卡提供24位元颜色(也称「true color」或「数百万色」)或16位元颜色(「增强色」或「数万种颜色」),一些显示卡-尤 ...

  6. Android 天气APP(二十六)增加自动更新(检查版本、通知栏下载、自动安装)

    上一篇:Android 天气APP(二十五)地图天气(下)嵌套滑动布局渲染天气数据 效果图 开发流程 1.开发前言 2.上传应用到分发平台 3.版本数据请求与存储 4.检查版本更新.自定义更新提示弹窗 ...

  7. VUE : 双重 for 循环写法、table 解析任意 list 、万能表格组件、解析一维数组、动态生成 table 所有数据

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1.需求: 我想要一个 table 组件能在实际调用时动态生成所有的  tr .td . 后端返回的 ...

  8. 【正点原子STM32连载】 第二十六章 USMART调试组件实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  9. 开发指南专题十:JEECG微云快速开发平台--表单校验组件ValidForm

    开发指南专题十:JEECG微云快速开发平台--表单校验组件ValidForm 10.4Validform对象[方法支持链式调用] 如示例 var demo=$(".formsub" ...

最新文章

  1. MVC中,视图的Layout使用
  2. 十、oracle 常用函数
  3. mysql check exist_mysql – 使用多个EXIST进行查询
  4. C. Number of Pairs
  5. Linux该如何学习(新手入门必看)
  6. Pentium II Pentium III架构/微架构/流水线 (7) - 微架构框图
  7. php日期数组,关于php日期数组的用法汇总
  8. linux中命令du -sm,Linux中的Du命令
  9. c语言pic延时1ms程序,几个延时子程序
  10. 病毒分析三:勒索病毒分析
  11. java clh_【Java】CLH 自旋锁
  12. acx_pthread.m4
  13. 用Arduino自制一个小型蜘蛛机器人
  14. 谷歌地图各级比例尺及空间分辨率
  15. 归并排序(Python)
  16. 易鑫集团Java面试题_史上最全!2020面试阿里,字节跳动90%被问到的JVM面试题(附答案)...
  17. 南瓜派php,南瓜派 巧克力塔
  18. 一、【s3c2440移植u-boot-2016-11】拷贝代码并在NOR Flash上启动u-boot
  19. 画【Python折线图】的一百个学习报告(三、设置全局 Label 颜色)
  20. JAVA开发(H5商城嵌套到第三方H5商城进行异业合作方案)

热门文章

  1. SEO网站排名刷量代码中的一些坑
  2. iphone刷linux教程视频,「干货」 iPhone 刷 Android10 详细教程来了
  3. BI软件是做什么用的
  4. 20144303 《Java程序设计》第二次实验实验报告
  5. 《Parallel Instance Query Network for Named Entity Recognition》论文阅读
  6. pilt图像处理_干货 | 用Python做图像处理:图像导数实战
  7. 【Music】横屏歌词显示效果不好
  8. 累觉不爱?这样做让你的坏情绪一扫而空!
  9. 工业物联网·智慧油田远程监控系统方案
  10. 【附源码】计算机毕业设计java综合售楼系统设计与实现