JSF组件SelectOneRadio
布局非常有限,所以我为它编写了一个自定义渲染器,它工作得很好。但是,有时我也想使用标准的SelectOneRadio布局。所以我决定使用我创建的自定义渲染器创建我的新组件,但我希望这个新组件能够镜像SelectOneRadio
的功能,唯一不同的是它将使用我的渲染器。在这种情况下,我是否需要创建custom tag
和custom component
以与custom renderer
一起使用?我应该class
扩展以获取SelectOneRadio
的所有功能?如果您能提供一些代码,我将不胜感激。
修改
@BalusC:我喜欢你想要检测layout
的值来委托正确的渲染器。因此,如果我有layout =“div_layout”,那么效果很好,但如果它是pageDirection
或lineDirection
并且没有显示任何内容。我做的是:我创建了一个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(context,component);确实渲染,但不渲染无线电,而是渲染select option
标记。所以我似乎委托错误的渲染器。我需要使用RadioRenderer而不是MenuRenderer。
答案 0 :(得分: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>
如果您希望独立于实现,那么您需要自己编写整个渲染器实现。
如果您希望有自定义组件,那么您也需要自己编写。