重写primefaces的selectCheckboxMenuRenderer

时间:2013-09-06 13:54:36

标签: jsf primefaces renderer

我试图通过扩展SelectCheckboxMenuRenderer并覆盖encodeOption方法,将title属性添加到primefaces的selectCheckboxMenu组件中。

但它看起来像是使用了不同的渲染器。检查页面的html源代码时,我可以看到呈现的无序列表项,我在SelectCheckboxMenuRenderer类中看不到任何内容。

我不确定我是否遗漏了任何东西。

    public class CustomSelectCheckboxMenuRenderer extends SelectCheckboxMenuRenderer
    {
@Override
protected void encodeOption(FacesContext context, SelectCheckboxMenu menu, Object values, Object submittedValues,
        Converter converter, SelectItem option, int idx) throws IOException
{
    ResponseWriter writer = context.getResponseWriter();
    String itemValueAsString = getOptionAsString(context, menu, converter, option.getValue());
    String name = menu.getClientId(context);
    String id = name + UINamingContainer.getSeparatorChar(context) + idx;
    boolean disabled = option.isDisabled() || menu.isDisabled();

    Object valuesArray;
    Object itemValue;
    if (submittedValues != null)
    {
        valuesArray = submittedValues;
        itemValue = itemValueAsString;
    }
    else
    {
        valuesArray = values;
        itemValue = option.getValue();
    }

    boolean checked = isSelected(context, menu, itemValue, valuesArray, converter);
    if (option.isNoSelectionOption() && values != null && !checked)
    {
        return;
    }

    // input
    writer.startElement("input", null);
    writer.writeAttribute("id", id, null);
    writer.writeAttribute("name", name, null);
    writer.writeAttribute("type", "checkbox", null);
    writer.writeAttribute("value", itemValueAsString, null);

    if (checked)
        writer.writeAttribute("checked", "checked", null);
    if (disabled)
        writer.writeAttribute("disabled", "disabled", null);
    if (menu.getOnchange() != null)
        writer.writeAttribute("onchange", menu.getOnchange(), null);

    writer.endElement("input");

    // label
    writer.startElement("label", null);
    writer.writeAttribute("for", id, null);
    if (disabled)
        writer.writeAttribute("class", "ui-state-disabled", null);

    writer.writeAttribute("title", option.getDescription(), null);

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

    writer.endElement("label");
}

}

这是我的customSelectCheckboxMenuRenderer类。我已使用 * 标记了我在代码中添加的行。如果我错过了什么,请告诉我。

1 个答案:

答案 0 :(得分:1)

适合我。显然您忘记在faces-config.xml注册渲染器。

以下是我如何做到这一点,整个课程未经修改后被复制到com.example包中:

<render-kit>
    <renderer>
        <component-family>org.primefaces.component</component-family>
        <renderer-type>org.primefaces.component.SelectCheckboxMenuRenderer</renderer-type>
        <renderer-class>com.example.CustomSelectCheckboxMenuRenderer</renderer-class>
    </renderer>
</render-kit>

您只需要编辑<renderer-class>以匹配渲染器类的FQN。