PrimeFaces 3维DataTable

时间:2013-05-03 01:11:47

标签: jsf primefaces

我有一个2D DataTable,我想在里面插入可变数量的面板,基本上创建一个3D DataTable。

2D表如下所示: 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>

和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; }
}

但我想实现以下目标,其中p1,p2,p3等是PrimeFaces面板:

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

是否可以使用第三维(字符串列表)为DataTable的每个单元格中的每个字符串创建一个面板?

1 个答案:

答案 0 :(得分:4)

RongNK建议的解决方案是使用ui:repeat。

通过使用括号符[][],可以指定第三维的数组。可以分别从rowIndexVarcolIndexVar的{​​{1}}和<p:dataTable>属性访问行和列的索引。

<p:columns>