9

の各要素にツールチップを追加したいと思いp:selectManyCheckBoxます。しかし、私は解決策を思い付くことができません。

Role「id」(Long)、「name」(文字列)、「description」(文字列) の 3 つのプロパティを持つクラスがあります。名前が表示され、説明をツールチップにしたい。

これは実用的なコードです:

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

はを id に、またはその逆に変換するroleConverterです。FacesConverterRole

私はこれを思いついた:

<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をまだ使用しておらず、何らかの理由でアップグレードできない場合は、PrimeFacesSelectManyCheckboxRenderer#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 に答える