2013-05-03 7 views
2

J'ai un DataTable 2D que je voudrais insérer un nombre variable de panneaux à l'intérieur, créant essentiellement un DataTable 3D.PrimeFaces 3 dimensions DataTable

Le tableau 2D se présente comme suit: 2D Table ll

<p:dataTable var="rowName" value="#{tableBean.rowNames}"> 
    <p:column headerText="" styleClass="ui-widget-header"> 
     <h:outputText value="#{rowName}"/> 
    </p:column> 

    <p:columns var="columnName" value="#{tableBean.colNames}" headerText="#{columnName}"> 
     <p:panel> 
     <h:outputText value="panel"/> 
     </p:panel> 
    </p:columns> 
</p:dataTable> 

Et Java:

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.RequestScoped; 
import java.util.ArrayList; 
import java.util.List; 

@ManagedBean 
@RequestScoped 
public class TableBean { 
    private List<String> rowNames = new ArrayList<String>(); 
    private List<String> colNames = new ArrayList<String>(); 
    private ArrayList<ArrayList<ArrayList<String>>> data3D = new ArrayList<ArrayList<ArrayList<String>>>(); 

    public TableBean() { 
     rowNames.add("row1"); 
     rowNames.add("row2"); 

     colNames.add("col1"); 
     colNames.add("col2"); 
     colNames.add("col3"); 

     // Setup 3 dimensional structure 
     for (int i = 0; i < rowNames.size(); i++) { 
      data3D.add(new ArrayList<ArrayList<String>>()); 
      for (int j = 0; j < colNames.size(); j++) { 
       data3D.get(i).add(new ArrayList<String>()); 
      } 
     } 

     // row 1, col 1, 3 items 
     data3D.get(0).get(0).add("item1"); 
     data3D.get(0).get(0).add("item2"); 
     data3D.get(0).get(0).add("item3"); 

     // row 1, col 2, 1 items 
     data3D.get(0).get(1).add("item1"); 

     // row 1, col 3, 2 items 
     data3D.get(0).get(2).add("item1"); 
     data3D.get(0).get(2).add("item2"); 

     // row 2, col 1, 2 item 
     data3D.get(1).get(0).add("item1"); 
     data3D.get(1).get(0).add("item2"); 

     // row 2, col 2, 1 item 
     data3D.get(1).get(1).add("item1"); 
    } 

    public List<String> getRowNames() { return rowNames; } 
    public void setRowNames(List<String> rowNames) { this.rowNames = rowNames; } 

    public List<String> getColNames() { return colNames; } 
    public void setColNames(List<String> colNames) { this.colNames = colNames; } 

    public ArrayList<ArrayList<ArrayList<String>>> getData3D() { return data3D; } 
    public void setData3D(ArrayList<ArrayList<ArrayList<String>>> data3D) { this.data3D = data3D; } 
} 

Mais je voudrais réaliser ce qui suit, où p1, p2, p3, etc sont Panneaux PrimeFaces:

+------+--------+--------+--------+-- 
|  | Col1 | Col2 | Col3 | .... .... .... .... 
+------+--------+--------+--------+-- 
|  | +----+ | +----+ | +----+ | 
|  | | p1 | | | p1 | | | p1 | | 
|  | +----+ | +----+ | +----+ | 
| Row1 | | p2 | |  | | p2 | | 
|  | +----+ |  | +----+ | 
|  | | p3 | |  |  | 
|  | +----+ |  |  | 
+------+--------+--------+--------+ 
|  | +----+ | +----+ |  | 
|  | | p1 | | | p1 | |  | 
| Row2 | +----+ | +----+ |  | 
|  | | p2 | |  |  | 
|  | +----+ |  |  | 
+------+--------+--------+--------+ 
| .... | 
| .... | 
    .... 

Est -il possible d'utiliser la 3ème dimension (liste de chaînes) pour créer un panneau pour chaque chaîne, dans chaque cellule du DataTable?

+0

Vous voulez que chaque cellule puisse avoir plusieurs panneaux? –

+0

Oui, c'est ce que j'essaie d'accomplir. – ChrisM

+2

Dans chaque cellule, vous pouvez itérer en utilisant

Répondre

4

La solution proposée par RongNK est d'utiliser ui: repeat. En utilisant la notation d'accolade [][], le tableau de la 3e dimension peut être spécifié. L'index de la ligne et de la colonne est accessible à partir des attributs rowIndexVar et colIndexVar respectivement de <p:dataTable> et <p:columns>.

<p:dataTable var="rowName" value="#{tableBean.rowNames}" rowIndexVar="rowIdx"> 
    <p:column headerText="" styleClass="ui-widget-header"> 
     <h:outputText value="#{rowName}"/> 
    </p:column> 

    <p:columns var="columnName" value="#{tableBean.colNames}" headerText="#{columnName}" 
       columnIndexVar="colIdx"> 
     <ui:repeat value="#{tableBean.data3D[rowIdx][colIdx]}" var="data"> 
      <p:panel> 
       <h:outputText value="#{data}"/> 
      </p:panel> 
     </ui:repeat> 
    </p:columns> 
</p:dataTable> 
+0

Auto-allégé. Bon travail ! –