1

JSF 组件SelectOneRadio布局非常有限,所以我为它编写了一个自定义渲染器,它工作得很好。但是,有时我也想使用标准的 SelectOneRadio 布局。所以我决定让我的新组件利用我创建的自定义渲染器,但我希望这个新组件能够反映 的功能SelectOneRadio,唯一不同的是它将使用我的渲染器。在这种情况下,我是否需要同时创建custom tagcustom component使用我custom renderer的?我class应该扩展什么来获得所有功能SelectOneRadio?如果您能提供一些代码,我将不胜感激。

编辑
@BalusC:我喜欢你关于检测layout委托正确渲染器的值的想法。因此,如果我有 layout="div_layout",那么它工作得很好,但如果它是pageDirectionlineDirection没有出现。我所做的是:我创建了一个类extends MenuRenderer并覆盖了encodeEnd方法,所以在那里我做了这个

String layout = (String) component.getAttributes().get("layout");

if(layout != null){
        if(layout.equals(PAGE_DIRECTION) || layout.equals(LINE_DIRECTION)){
            super.encodeEnd(context, component);
            return;
        } else if (!layout.equals(DIV_LAYOUT)){
            //Throw error message
        }
}
//Continue with my own renderer code

EDIT2
上面当我说什么都没出现时,我错了。super.encodeEnd(上下文,组件);确实渲染了,但不是渲染收音机,而是渲染select option标签。所以看来我委托给了错误的渲染器。我需要使用 RadioRenderer 而不是 MenuRenderer。

4

1 回答 1

3

如果它特定于您自己的 Web 应用程序,那么您可以只替换渲染器。最简单的方法是扩展特定于实现的渲染器,然后根据标准属性之一的值(layout是最佳选择)委托给特定于实现的渲染器,或者执行您自己的自定义渲染工作。

我是 Mojarra 的情况,您想扩展com.sun.faces.renderkit.html_basic.RadioRenderer然后按如下方式注册它

<renderkit>
    <renderer>
        <component-family>javax.faces.SelectOne</component-family>
        <renderer-type>javax.faces.Radio</renderer-type>
        <renderer-class>com.example.ExtendedRadioRenderer</renderer-class>
    </renderer>
</renderkit>

如果您希望实现独立,那么您需要自己编写整个渲染器实现。

如果您希望有一个自定义组件,那么您也需要自己编写它。

于 2012-07-07T23:38:37.557 回答