Crie um panelGroup na sua pagina e faca o binding dele com um bean:
<h:panelGroup binding="#{bean.dataTableGroup}" />
Ai Nesta classe abstrata crio o dataTabelGroup e adicono as RichDataTable nele
package br.com.xyz.mbean;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
import javax.el.ValueExpression;
import javax.faces.component.UIComponent;
import javax.faces.component.html.HtmlGraphicImage;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.component.html.HtmlPanelGroup;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.DateTimeConverter;
import javax.faces.el.MethodBinding;
import javax.faces.model.DataModel;
import org.ajax4jsf.component.html.HtmlAjaxCommandLink;
import org.richfaces.component.html.HtmlColumn;
import org.richfaces.component.html.HtmlDataTable;
import org.richfaces.component.html.HtmlDatascroller;
import br.com.mbean.qualidade.BasicMbeanInterface;
import br.com.vo.ComponentType;
import br.com.vo.CustomColumnsVO;
import br.com.vo.CustomTableVO;
/**
* @author Leandro de Godoy
* @date 24/03/2011
*
*/
public abstract class DataTableModel implements BasicMbeanInterface{
private HtmlPanelGroup dataTableGroup;
public DataModel model;
/**
* @author Leandro de Godoy
*/
public DataTableModel() {
super();
}
/**
* // Executa a implementacao do metodo na classe implementadora
*
* @author Leandro de Godoy
* @date 24/03/2011
*
* @return
*/
public abstract CustomTableVO getCustomTableVO();
/**
* // Executa a implementacao do metodo na classe implementadora
*
* @author Leandro de Godoy
* @date 24/03/2011
*
* @return
*/
public abstract List<CustomColumnsVO> loadCustomColumns();
/**
* // Método que cria o objeto HtmlDataTable
*
* @author Leandro de Godoy
* @date 24/03/2011
*
* @param customTableVO
*/
@SuppressWarnings("deprecation")
private void populateDataTable(CustomTableVO customTableVO) {
HtmlDataTable dataTable = new HtmlDataTable();
CustomTableVO customDataTable = getCustomTableVO();
dataTable = new HtmlDataTable();
//dataTable.setValueExpression("value", createValueExpression(
// customDataTable.getValueExpression(), ListDataModel.class));
dataTable.setVar(customDataTable.getVar());
dataTable.setRows(customDataTable.getRows());
dataTable.setSortMode(customDataTable.getSortMode());
dataTable.setAlign(customDataTable.getAlign());
dataTable.setId(customDataTable.getId());
for (CustomColumnsVO vo : customDataTable.getColunas()) {
HtmlColumn column = new HtmlColumn();
if (vo.getColumnId() != null) {
column.setId(vo.getColumnId());
}
column.setSortable(true);
column.setSortBy(vo.getExpression());
dataTable.getChildren().add(column);
HtmlOutputText outPutText = new HtmlOutputText();
outPutText.setValue(vo.getColumnName());
column.setHeader(outPutText);
if (vo.getComponentType().equals(ComponentType.OUTPUT_TEXT)) {
HtmlOutputText outputValue = new HtmlOutputText();
outputValue.setValueExpression("value", createValueExpression(
vo.getExpression(), vo.getColumnClassType()));
column.getChildren().add(outputValue);
} else if (vo.getComponentType().equals(ComponentType.COMMAND_LINK)) {
HtmlAjaxCommandLink link = new HtmlAjaxCommandLink();
link.setActionListener(createActionListenerMethodBinding(vo
.getActionListenerMethodBinding()));
link.setOncomplete(vo.getOnComplete());
link.setDisabled(vo.getDisabled());
HtmlOutputText textLink = new HtmlOutputText();
textLink.setValueExpression("value", createValueExpression(vo
.getExpression(), vo.getColumnClassType()));
if (vo.getColumnClassType().equals(Date.class)) {
DateTimeConverter dateConverter = (DateTimeConverter) FacesContext
.getCurrentInstance().getApplication()
.createConverter(DateTimeConverter.CONVERTER_ID);
dateConverter.setPattern("MM/yyyy");
dateConverter.setLocale(new Locale("pt_Br"));
textLink.setConverter(dateConverter);
}
link.getChildren().add(textLink);
column.getChildren().add(link);
} else if (vo.getComponentType().equals(ComponentType.BUTTON)) {
HtmlAjaxCommandLink link = new HtmlAjaxCommandLink();
link.setActionListener(createActionListenerMethodBinding("#{mbPeriodoOperacao.actionEdit}"));
link.setOncomplete(vo.getOnComplete());
link.setDisabled(vo.getDisabled());
HtmlGraphicImage image = new HtmlGraphicImage();
image.setUrl("/images/_deletar.jpg");
image.setStyle("border: none;");
link.getChildren().add(image);
link.setReRender(dataTable.getId());
column.getChildren().add(link);
}
}
HtmlDatascroller scroll = new HtmlDatascroller();
dataTable.setFooter(scroll);
dataTable.setValue(getModel());
dataTableGroup = new HtmlPanelGroup();
dataTableGroup.getChildren().add(dataTable);
dataTable.processValidators(FacesContext.getCurrentInstance());
dataTable.processUpdates(FacesContext.getCurrentInstance());
}
/**
* // Método que cria as colunas com os parametro informados
*
* @author Leandro de Godoy
* @date 24/03/2011
*
* @param columnName
* @param expression
* @param columnType
* @param componentType
* @return
*/
public final CustomColumnsVO createColumn(String columnName,
String expression, Class<?> columnType,
ComponentType componentType, String actionListenerMethodBinding,
Boolean disabled, String onComplete) {
CustomColumnsVO v = new CustomColumnsVO();
v.setColumnName(columnName);
v.setColumnClassType(columnType);
v.setComponentType(componentType);
v.setActionListenerMethodBinding(actionListenerMethodBinding);
v.setDisabled(disabled);
v.setOnComplete(onComplete);
if (expression != null) {
v.setExpression(expression);
String expr = expression.replace("#", "").replace("{", "").replace(
"}", "");
String[] partsName = expr.split("\\.");
v.setColumnId(partsName[partsName.length - 1] + "Column");
}
return v;
}
/**
* // Método que cria um MethodBinding a partir de uma expression String
*
* @author Leandro de Godoy
* @date 24/03/2011
*
* @param actionListenerString
* @return
*/
@SuppressWarnings("deprecation")
private MethodBinding createActionListenerMethodBinding(
String actionListenerString) {
FacesContext facesContext = FacesContext.getCurrentInstance();
MethodBinding mb = facesContext.getApplication().createMethodBinding(
actionListenerString,
new Class[] { javax.faces.event.ActionEvent.class });
return mb;
}
/**
* // Método que cria um ValueExpression a partir de uma expression em
* String
*
* @author Leandro de Godoy
* @date 24/03/2011
*
* @param valueExpression
* @param valueType
* @return
*/
private ValueExpression createValueExpression(String valueExpression,
Class<?> valueType) {
FacesContext facesContext = FacesContext.getCurrentInstance();
return facesContext.getApplication().getExpressionFactory()
.createValueExpression(facesContext.getELContext(),
valueExpression, valueType);
}
/**
* Classe Interna para conversao de valores tipo Date informada em campos de
* LINK
*
* @author Leandro de Godoy
* @date 24/03/2011
*
*/
class DateConverter implements Converter {
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String s) {
Calendar c = GregorianCalendar.getInstance();
String[] parts = s.split("/");
String mes = parts[0];
String ano = parts[1];
c.set(Calendar.MONTH, new Long(mes).intValue());
c.set(Calendar.YEAR, new Long(ano).intValue());
c.set(Calendar.DAY_OF_MONTH, c
.getActualMinimum(Calendar.DAY_OF_MONTH));
return c.getTime();
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object o) {
DateFormat sdf = new SimpleDateFormat("MM/yyyy");
sdf.setTimeZone(TimeZone.getTimeZone("America/Sao_Paulo"));
Date data = (Date) o;
return sdf.format(data);
}
}
public HtmlPanelGroup getDataTableGroup() {
if (dataTableGroup == null) {
populateDataTable(new CustomTableVO()); // Populate datatable.
}
return dataTableGroup;
}
public void setDataTableGroup(HtmlPanelGroup dataTableGroup) {
this.dataTableGroup = dataTableGroup;
}
/**
* // Método que forca a criacao od modelo de dados na
* classe implementadora
*
* @author Leandro de Godoy
* @date 24/03/2011
*
* @return
*/
public abstract DataModel getModel() ;
public abstract void setModel(DataModel model) ;
}
public enum ComponentType {
COMMAND_LINK, OUTPUT_TEXT, BUTTON;
}
/**
* @author Leandro de Godoy
* @date 24/03/2011
*
*/
public class CustomColumnsVO {
/**
* Expressao de valore da coluna
*/
private String expression;
/**
* Nome da Coluna
*/
private String columnName;
/**
* ID da coluna
*/
private String columnId;
/**
* Classe do Objeto na Coluna Caso Date , sera utilizado o converter de Data
*/
private Class<?> columnClassType;
/**
* Tipo do component: Button Link OutPutText
*/
private ComponentType componentType;
/**
* em caso de Botao excluir e editar, expressao de validação de
* habilita/desabilita
*/
private Boolean disabled = false;
/**
* MethodBinding do componente
*/
private String actionListenerMethodBinding;
/**
* javaScript a ser executado no fim da requisicao ajax
*/
private String onComplete;
/**
* @author Leandro de Godoy
*/
public CustomColumnsVO() {
}
/**
* @author Leandro de Godoy
* @date 24/03/2011
*
*/
public class CustomTableVO {
/**
* ID da table
*/
private String id = "table";
/**
* numero de Linhas da Tabela
*/
private int rows = 5;
/**
* Expressao Binding do value da tabela
*/
private String valueExpression;
/**
* nome da var utilizadad pela tabela
*/
private String var = "item";
/**
* alingn da tabela
*/
private String align = "center";
/**
* Tipo de Sort da tabela
*/
private String sortMode = "single";
/**
* Lista de colunas da tabela
*/
private List<CustomColumnsVO> colunas;
Com isso vc consegue criar um panelGroup e adicionar as tabelas a ele de forma programatica.