4

将 JSF 2.1 与 primefaces 一起使用

class FOO{
String name;
String value;
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
public void setValue(String value){
this.value=value;
}
public String getValue(){
return this.value;
}

}

我有一个Map<String, List<FOO>>

标题名称应该是 Map 的 Key。我需要创建多个列(即 Map 的大小),并且每列都应该有 FOO 列表以在行中显示 FOO.Name。

例如: 如果地图的大小是 4

列-----Key1

第一列的行 -List<FOO>针对 Key1

列-----Key2

第一列的行 -List<FOO>针对 Key2

列-----Key3

第一列的行 -List<FOO>针对 Key3

列-----Key4

第一列的行 -List<FOO>针对 Key4

有人能告诉我使用什么组件在 xhtml 页面中显示这种类型的输出吗?我曾尝试使用动态数据表创建,但无法显示这一点。

4

2 回答 2

4

你有一个错误的数据结构。将其更改为正确的数据结构。最简单的方法是收集List<Map<String, Object>>代表rows属性的数据。Map表示列,以列名作为键。将这些列名称收集在一个单独List<String>的代表columns属性中。最后显示如下<p:columns>

<p:dataTable value="#{bean.rows}" var="row">
    <p:columns value="#{bean.columns}" var="column">
        #{row[column]}
    </p:columns>
</p:dataTable>

如有必要,您可以将奇怪的数据结构转换为正确的数据结构(并假设每个List<FOO>数据结构的大小相同;否则整个数据结构的意义不大):

Map<String, List<FOO>> wrongDataStructure = createItSomehow();
List<String> columns = new ArrayList<String>(wrongDataStructure.keySet()); // Note I expect LinkedHashMap ordering here.
List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();
int size = wrongDataStructure.values().iterator().next().size();

for (int i = 0; i < size; i++) {
    Map<String, Object> row = new HashMap<String, Object>();

    for (String column : columns) {
        row.put(column, wrongDataStructure.get(column).get(i).getName());
    }

    rows.add(row);
}

// Now use "columns" and "rows".
于 2013-01-30T20:59:23.673 回答
0

如果不使用技巧,我想不出办法做到这一点:由于地图中列表的大小可能因每个键集而异,因此您需要知道具有最大项目集的列表的大小。通过知道你可以想出这个奇怪的解决方案:这个想法是在 for 循环中有一个 for 循环。

private Map<String, List<Foo>> fooMap = Maps.newHashMap();
private List<Foo> highestNumberOfFoos;

private init()
{
    highestNumberOfFoos = Lists.newArrayList(new Foo("a", "b"), new Foo("c", "d"), new Foo("e", "f")); // We know that there won't be any list who has more items than this item.
    fooMap.put("name1", highestNumberOfFoos);
    fooMap.put("name2", Lists.newArrayList(new Foo("g", "h"), new Foo("i", "j")));
}

...在视图中:

<table>
      <thead>
              <tr>
                  <ui:repeat value="#{bean.fooMap.keySet().toArray()}" var="key">
                         <td>#{key}</td>
                   </ui:repeat>
              </tr>
       </thead>
       <tbody>
             <ui:repeat value="#{bean.highestNumberOfFoos}" var="dummyFoo" varStatus="vs">
             <tr>
                 <ui:repeat value="#{bean.fooMap.entrySet().toArray()}" var="innerEntry">
                     <td>#{innerEntry.value[vs.index].name}</td>
                  </ui:repeat>
             </tr>
                  </ui:repeat>
       </tbody>
 </table>
于 2013-01-30T20:20:54.643 回答