【问题标题】:Primefaces tooltip for p:selectManyCheckbox or other p:selectMany*/One*p:selectManyCheckbox 或其他 p:selectMany*/One* 的 Primefaces 工具提示
【发布时间】:2012-08-02 15:04:13
【问题描述】:

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

但不幸的是它不起作用。

【问题讨论】:

    标签: jsf primefaces tooltip


    【解决方案1】:

    您可以通过使用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 (actually because of this very answer you're reading now) 起支持此功能。

    如果您还没有使用 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>
    

    【讨论】:

      【解决方案2】:

      自 Primefaces v6.2 版本以来,对 selectManyCheckbox 的工具提示支持为 added。其他组件也支持这一点。

      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

      【讨论】:

        【解决方案3】:

        我不得不修改 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;
        }
        

        那么这些 SelectItem 可以用于:

        <f:selectItems value="#{myBean.myItems}"/>
        

        【讨论】:

        • 委托人/客户和访问权限特定的 SelectItems。在 Bean 端执行此操作的代码比在 xhtml 中更好。
        猜你喜欢
        • 2021-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-07
        • 2015-10-28
        相关资源
        最近更新 更多