9

我想为 a 中的每个元素添加一个工具提示p:selectManyCheckBox。但是我想不出解决方案。

我有一个Role有 3 个属性的类,“id”(长)、“name”(字符串)和“description”(字符串)。显示名称,我希望将描述作为工具提示。

这是一段工作代码:

<p:selectManyCheckbox layout="pageDirection" value="#{roleBean.selectedRoles}" converter="roleConverter">
    <f:selectItems value="#{roleBean.roles}" var="role" itemLabel="#{role.name}" itemValue="#{role}"/>
</p:selectManyCheckbox>

roleConverter是将FacesConverter转换Role为 id 的,反之亦然。

我想出了这个:

<p:selectManyCheckbox layout="pageDirection" value="#{roleBean.selectedRoles}" converter="roleConverter">
    <c:forEach var="role" items="#{roleBean.roles}">
        <f:selectItem id="role#{role.id}" itemLabel="#{role.name}" itemValue="#{role}" />
        <p:tooltip for="role#{role.id}" value="#{role.description}"/>
    </c:forEach>
</p:selectManyCheckbox>

但不幸的是,它不起作用。

4

3 回答 3

16

您可以通过使用以下SelectItem#getDescription()属性来实现此目的:

<p:selectManyCheckbox layout="pageDirection"
    value="#{roleBean.selectedRoles}" converter="roleConverter">
    <f:selectItems value="#{roleBean.roles}" var="role" 
        itemValue="#{role}" itemLabel="#{role.name}" 
        itemDescription="#{role.description}" />
</p:selectManyCheckbox>

从 PrimeFaces 6.2 开始支持这一点(实际上是因为您现在正在阅读这个答案)。

如果您还没有使用 PrimeFaces 6.2 并且由于某种原因无法升级,那么您需要手动覆盖 PrimeFaces SelectManyCheckboxRenderer#encodeOptionLabel(),如下所示以识别和渲染它:

public class YourSelectManyCheckboxRenderer extends SelectManyCheckboxRenderer {

    @Override
    protected void encodeOptionLabel(FacesContext context, SelectManyCheckbox checkbox, String containerClientId, SelectItem option, boolean disabled) throws IOException {
        ResponseWriter writer = context.getResponseWriter();
        writer.startElement("label", null);
        writer.writeAttribute("for", containerClientId, null);

        if (option.getDescription() != null) {
            writer.writeAttribute("title", option.getDescription(), null);
        }

        if (disabled) {
            writer.writeAttribute("class", "ui-state-disabled", null);
        }

        if (option.isEscape()) {
            writer.writeText(option.getLabel(), null);
        } else {
            writer.write(option.getLabel());
        }

        writer.endElement("label");
    }

}

注册如下faces-config.xml

<render-kit>
    <renderer>
        <component-family>org.primefaces.component</component-family>
        <renderer-type>org.primefaces.component.SelectManyCheckboxRenderer</renderer-type>
        <renderer-class>com.example.YourSelectManyCheckboxRenderer</renderer-class>
    </renderer>
</render-kit>
于 2012-09-20T12:13:17.087 回答
1

自 Primefaces v6.2 版本起添加了对 selectManyCheckbox 的工具提示支持。其他组件也支持这一点。

XHTML 代码与 BalusC 报告的相同

<p:selectManyCheckbox layout="pageDirection" value="#{roleBean.selectedRoles}" converter="roleConverter">
    <f:selectItems value="#{roleBean.roles}" var="role" 
        itemValue="#{role}" itemLabel="#{role.name}" itemDescription="#{role.description}" />
</p:selectManyCheckbox>

但不再需要覆盖 PrimeFaces SelectManyCheckboxRenderer

于 2019-09-17T10:13:08.087 回答
0

我不得不修改 BalusC 的解决方案以使其适用于我的情况。那是因为我必须在 Bean 端构建 SelectItems 列表。

public List<SelectItem> getMyItems(){
  List<SelectItem> mySelectItems = new ArrayList<>();
  [loop or ohter code to collect items]
  // create SelectItem with description
  mySelectItems.add(new SelectItem([value], [label], [description]));
  ...
  return mySelectItems;
}

然后这些 SelectItems 可以用于:

<f:selectItems value="#{myBean.myItems}"/>
于 2018-04-04T09:26:23.457 回答