Table 组件使用指南之十六:动态增加Column
运行环境: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相关推荐
- 开发指南专题十六:JEECG微云快速开发平台Excel导出
开发指南专题十六:JEECG微云快速开发平台Excel导出 14.3. Excel导出 导出工具类ExcelExportUtil 提供两个函数 //创建多个Sheet public static H ...
- 游戏感:虚拟感觉的游戏设计师指南——第十六章 Raptor Safari
这是一本游戏设计方面的好书 转自天:天之虹的博客:http://blog.sina.com.cn/jackiechueng 感谢天之虹的无私奉献 Word版可到本人的资源中下载 第十六章 Raptor ...
- 高速PCB设计指南(十六)
第二篇 实现PCB高效自动布线的设计技巧和要点 尽管现在的EDA工具很强大,但随着PCB尺寸要求越来越小,器件密度越来越高,PCB设计的难度并不小.如何实现PCB高的布通率以及缩短设计时间呢?本文介 ...
- android开发菜单,Android学习指南之十六:Android菜单详解
Android用户界面的组成除了View外,还包括菜单和对话框,本节我们先来学习一下菜单的使用方法. 菜单Menu是Android用户界面中最常见的元素之一,使用非常频繁.Android菜单主要分为三 ...
- Windows程式开发设计指南(十六)调色盘管理器
16. 调色盘管理器 如果硬体允许,本章就没有存在的必要.尽管许多现代的显示卡提供24位元颜色(也称「true color」或「数百万色」)或16位元颜色(「增强色」或「数万种颜色」),一些显示卡-尤 ...
- Android 天气APP(二十六)增加自动更新(检查版本、通知栏下载、自动安装)
上一篇:Android 天气APP(二十五)地图天气(下)嵌套滑动布局渲染天气数据 效果图 开发流程 1.开发前言 2.上传应用到分发平台 3.版本数据请求与存储 4.检查版本更新.自定义更新提示弹窗 ...
- VUE : 双重 for 循环写法、table 解析任意 list 、万能表格组件、解析一维数组、动态生成 table 所有数据
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1.需求: 我想要一个 table 组件能在实际调用时动态生成所有的 tr .td . 后端返回的 ...
- 【正点原子STM32连载】 第二十六章 USMART调试组件实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...
- 开发指南专题十:JEECG微云快速开发平台--表单校验组件ValidForm
开发指南专题十:JEECG微云快速开发平台--表单校验组件ValidForm 10.4Validform对象[方法支持链式调用] 如示例 var demo=$(".formsub" ...
最新文章
- MVC中,视图的Layout使用
- 十、oracle 常用函数
- mysql check exist_mysql – 使用多个EXIST进行查询
- C. Number of Pairs
- Linux该如何学习(新手入门必看)
- Pentium II Pentium III架构/微架构/流水线 (7) - 微架构框图
- php日期数组,关于php日期数组的用法汇总
- linux中命令du -sm,Linux中的Du命令
- c语言pic延时1ms程序,几个延时子程序
- 病毒分析三:勒索病毒分析
- java clh_【Java】CLH 自旋锁
- acx_pthread.m4
- 用Arduino自制一个小型蜘蛛机器人
- 谷歌地图各级比例尺及空间分辨率
- 归并排序(Python)
- 易鑫集团Java面试题_史上最全!2020面试阿里,字节跳动90%被问到的JVM面试题(附答案)...
- 南瓜派php,南瓜派 巧克力塔
- 一、【s3c2440移植u-boot-2016-11】拷贝代码并在NOR Flash上启动u-boot
- 画【Python折线图】的一百个学习报告(三、设置全局 Label 颜色)
- JAVA开发(H5商城嵌套到第三方H5商城进行异业合作方案)
热门文章
- SEO网站排名刷量代码中的一些坑
- iphone刷linux教程视频,「干货」 iPhone 刷 Android10 详细教程来了
- BI软件是做什么用的
- 20144303 《Java程序设计》第二次实验实验报告
- 《Parallel Instance Query Network for Named Entity Recognition》论文阅读
- pilt图像处理_干货 | 用Python做图像处理:图像导数实战
- 【Music】横屏歌词显示效果不好
- 累觉不爱?这样做让你的坏情绪一扫而空!
- 工业物联网·智慧油田远程监控系统方案
- 【附源码】计算机毕业设计java综合售楼系统设计与实现