Datatable dynamic columns
solstice_pan Feb 16, 2013 6:20 AMHi Guys,
i know this Subject has been discussed already, but the Reason i want to discuss it again is that i don´t find that this is so simple like in the Example. I´m just using Richfaces 3.3.3 with JSF 1.2 and need a dynamic Datatable, so i started to try by the Richfaces showcase example. With this simple example it was very easy for me to reproduce it, so i give another try with my usecase...and it won´t be run correctly...so let me explain
i have a Bean like this.
public class TableBean {
private String[] COLUMN_ONE_DATA_ARRAY = { "Column_ONE_Data1",
"Column_ONE_Data2", "Column_ONE_Data3", "Column_ONE_Data4",
"Column_ONE_Data5" };
private String[] COLUMN_TWO_DATA_ARRAY = { "Column_TWO_Data1",
"Column_TWO_Data2", "Column_TWO_Data3", "Column_TWO_Data4",
"Column_TWO_Data5" };
private List<Derivate> columnHeaderList ;
private List<Product[]> productListe ;
public List<Derivate> getColumnHeaderList() {
return columnHeaderList == null ? Collections.EMPTY_LIST : columnHeaderList;
}
public void setColumnHeaderList(List<Derivate> derivateList) {
this.columnHeaderList = derivateList;
}
public List<Product[]> getProductListe() {
return productListe;
}
public void setProductListe(List<Product[]> productListe) {
this.productListe = productListe;
}
public void performFillDerivateAndProductListActionEvent(ActionEvent event) {
fillDerivateList();
fillProductListe();
}
// THIS IS MY PROBLEM, AND CURRENTLY I HAVE NO GLUE HOW TO DO IT RIGHT
private void fillProductListe() {
if ( productListe == null) {
productListe = new ArrayList<Product[]>();
}
productListe.clear();
int derivateSize = columnHeaderList.size();
for ( int i = 0 ; i < derivateSize; i++) {
Derivate d = columnHeaderList.get(i);
for ( int j = 0 ; j < d.getProducts().size() ; j++ ) {
// HOW IT´s RIGHT..?????
Product[] p = new Product[derivateSize];
p[i] = new Product();
p[i].setProductName(d.getProducts().get(j).getProductName());
productListe.add(p);
}
}
// THIS WORKS CORRECTLY
//for ( int i = 0 ; i < 9 ; i++ ) {
// Product[] p = new Product[2];
// p[0] = new Product("COLUMN_DATA_ONE_" +i );
// p[1] = new Product("COLUMN_DATA_TWO_" +i);
// productListe.add(p);
//}
}
private Derivate createDerivate(String marketName){
Derivate d = new Derivate();
d.setDerivateName(marketName);
return d;
}
private void fillDerivateList() {
if ( columnHeaderList == null ) {
columnHeaderList = new ArrayList<Derivate>();
}
columnHeaderList.clear();
Derivate colOneDeriv =createDerivate("Column ONE");
for ( int i = 0 ; i < COLUMN_ONE_DATA_ARRAY.length ; i++ ) {
Product p = new Product();
p.setProductName(COLUMN_ONE_DATA_ARRAY[i]);
colOneDeriv.addProduct(p);
}
Derivate colTwoDeriv = createDerivate("Column TWO");
for ( int i = 0 ; i < COLUMN_TWO_DATA_ARRAY.length ; i++ ) {
Product p = new Product();
p.setProductName(COLUMN_TWO_DATA_ARRAY[i]);
colTwoDeriv.addProduct(p);
}
columnHeaderList.add(colOneDeriv);
columnHeaderList.add(colTwoDeriv);
}
}
public class Product {
private String productName ;
public Product() {
}
public Product(String productName) {
this.productName = productName;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
}
public class Derivate {
private String derivateName ;
private List<Product> products = new ArrayList<Product>() ;
public Derivate() {
}
public Derivate(String derivateName) {
this.derivateName = derivateName;
}
public String getDerivateName() {
return derivateName;
}
public void setDerivateName(String derivateName) {
this.derivateName = derivateName;
}
public List<Product> getProducts() {
return products;
}
public void setProducts(List<Product> products) {
this.products = products;
}
public void addProduct(Product p) {
products.add(p);
}
}
IN MY XHTML TEST PAGE
<h:form>
<a4j:commandButton
value="FILL LIST"
actionListener="#{tablePojo.performFillDerivateAndProductListActionEvent}"
reRender="ajaxpnl"
immediate="true"
/>
</h:form>
<rich:spacer/>
<a4j:outputPanel
ajaxRendered="false"
id="ajaxpnl
>
<rich:panel
header="TEST"
>
<h:form>
<rich:dataTable
width="700px"
value="#{tablePojo.productListe}"
var="product"
>
<c:forEach
items="#{tablePojo.columnHeaderList}"
var="column"
varStatus="status"
>
<rich:column
sortBy="#{column.derivateName}"
>
<f:facet name="header">
<h:outputText value="#{column.derivateName}" />
</f:facet>
<h:outputText value="#{product[status.index].productName}" />
</rich:column>
</c:forEach>
</rich:dataTable>
</h:form>
</rich:panel>
</a4j:outputPanel>
The Working Example looks like how i want it
and the not working example....
any help would be very appreciate !!!

