PrimeFaces复选框网格使用2个地图或带有行和列标题的列表?

时间:2013-06-06 16:12:59

标签: jsf checkbox primefaces grid-layout

我正在使用2个字符串地图。

  Map<String, String> offices;
  Map<String, String> services;

一个地图包含“办公室”,一个地图包含“提供的服务”。由于可以添加或删除新的办公室或服务,因此每个都是动态的。我的问题是如何成功地说明哪些办事处支持每项服务,最终如何捕获这些服务。

这就是我想要的样子:

enter image description here

我的第一个问题是我无法弄清楚如何使用PrimeFaces或JSF vanilla来表示这一点。我一直在寻找不同的东西,比如DataTable,但它们似乎都说明了一个“标题”,而不是我需要的列和行标题。或者它们说明了如何复杂地显示数据,所有这些都来自单个列表或地图。我需要说明2个地图会聚。我相信我需要将两个地图合并为一个单独的中间列表,但我对具体细节感到沮丧。

我的第二个问题是如何捕获返回的布尔值?我想我需要捕获索引,但它的具体细节暗指我。

编辑:代码和澄清:

  private Map<String, String> offices;

  public Map<String, String> getOffices() {
  return offices;
  }

//constructor
offices.put("PV001", "Pleasantville");
offices.put("GV001", "Green Valley");

然后在JSF / XHTML标记中:

<p:selectManyCheckbox>
    <f:selectItems value="#{myOffices.offices.entrySet()}"
        var="entry" itemLabel="#{entry.value}" itemValue="#{entry.key}" />
</p:selectManyCheckbox>

那么我如何将这样的CROSS 2地图与此相关并获得相关的复选标记。通常我会创建一个带有bodyWork,paint,oilChange属性的office类,但不幸的是我需要能够动态调整这些属性的数量,这就是我使用Map的原因。

1 个答案:

答案 0 :(得分:2)

关于布局,只需在<ui:repeat>的帮助下使用纯HTML。使用常规JSF表组件确实无法做到这一点。

<table>
    <thead>
        <tr>
            <th>Office</th>
            <ui:repeat value="#{bean.services.values().toArray()}" var="service">
                <th>#{service}</th>
            </ui:repeat>
        </tr>
    </thead>
    <tbody>
        <ui:repeat value="#{bean.offices.entrySet().toArray()}" var="office">
            <tr>
                <td>#{office.value}</td>
                <ui:repeat value="#{bean.services.keySet().toArray()}" var="service">
                    <td><p:selectBooleanCheckbox value="#{bean.officeServices[office.key][service]}" /></td>
                </ui:repeat>
            </tr>
        </ui:repeat>
    </tbody>
</table>

要修复look'n'feel,只需按常规方式输入一些CSS。必要时应用PrimeFaces用于其数据表/网格组件的相同CSS类名称,例如ui-datatable和兄弟。

对于捕获提交的值,请在<p:selectBooleanCheckbox>属性上使用一组Map<String, Map<String, Boolean>>个组件,这些组件由办公室ID和服务ID键入。以下是适当的bean的外观:

private Map<String, String> offices;
private Map<String, String> services;
private Map<String, Map<String, Boolean>> officeServices;

@PostConstruct
public void init() {
    offices = new LinkedHashMap<>();
    offices.put("o1", "office1");
    offices.put("o2", "office2");
    offices.put("o3", "office3");
    services = new LinkedHashMap<>();
    services.put("s1", "service1");
    services.put("s2", "service2");
    services.put("s3", "service3");
    officeServices = new HashMap<>();
    for (String office : offices.keySet()) {
        officeServices.put(office, new HashMap<String, Boolean>());
    }

}

public void submit() {
    for (Entry<String, Map<String, Boolean>> entry : officeServices.entrySet()) {
        String office = entry.getKey();
        Map<String, Boolean> services = entry.getValue();
        System.out.println(office + ": " + services);
    }
}

// 3 getters. No setters necessary.

<p:selectManyCheckbox>不是一个选项,因为您无法在每个单元格的基础上控制其渲染。

确保使用最新的Mojarra。已知旧版本具有与嵌套<ui:repeat>和ajax相关的错误。如果我是正确的,它固定在2.1.14~2.1.17左右。

相关问题