p:selectManyCheckbox或其他p:selectMany * / One *的界面工具提示

问题描述 投票:9回答:3

我想为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

我想出了这个:

<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>

但是很遗憾,它不起作用。

jsf primefaces tooltip
3个回答
16
投票

您可以通过使用SelectItem#getDescription()属性如下实现:

SelectItem#getDescription()

自PrimeFaces 6.2(<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 actually because of this very answer you're reading now,以便对其进行识别和渲染:

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

1
投票

从Selectfaces v6.2版本开始,对[selectManyCheckbox的工具提示支持为<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> 。其他组件也支持此功能。

XHTML代码与BalusC报告的相同

added

但不再需要覆盖PrimeFaces SelectManyCheckboxRenderer


0
投票

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

<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>

然后这些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;
}
© www.soinside.com 2019 - 2024. All rights reserved.