为TabView组件声明一个新的渲染器

时间:2012-05-07 16:22:31

标签: jsf-2 primefaces custom-component custom-renderer

我想在PrimeFaces Tab / Tabview组件的基础上构建一个新组件。它应该看起来像浏览器中的添加选项卡,并打开一个页面来填写表单。问题是我想基于数据模型(http://www.primefaces.org/showcase/ui/tabviewModel.jsf)将它集成到TabView中。现在,我可以组合一个选项卡来填充表单和带有预定义数据的选项卡,或者使用TabView,它可以为我的数据动态创建选项卡。

我已经阅读过有关以两种方式创建自定义组件的JSF文档 - 作为复合组件或新的Java类。我试图创建一个自定义组件,但它似乎没有按照我描述的方式工作。

我的问题是:

1)是否可以用复合组件解决这个问题?如果是的话,有人可以给我一个提示吗?

2)如果没有,是否有基于现有PrimeFaces组件(可能是新的TabView)编写新组件的教程?

UPD:在做了一些研究后,我意识到最简单的方法是为TabView编写一个新的渲染器。

我宣布了一个新的渲染器类:

public class AddableTabViewRenderer extends TabViewRenderer

并在faces-config.xml中注册:

<render-kit>
  <render-kit-id>HTML_BASIC</render-kit-id> 
  <renderer>
    <component-family>org.primefaces.component</component-family>
    <renderer-type>org.primefaces.component.TabView</renderer-type>
    <renderer-class>
      de.idealo.evaluation.jsf.webapp.component.AddableTabViewRenderer
    </renderer-class>
  </renderer>
</render-kit>   

但是,当渲染带有TabView组件的视图时,将调用TabViewRenderer的encodeEnd方法,而不是AddableTabViewRenderer的overriden方法。 你能告诉我一个问题可能在哪里吗?

1 个答案:

答案 0 :(得分:0)

我的配置中的渲染器类错误。我误解了有关注册组件的说明。我认为render-type是将使用自定义渲染器渲染的类。它必须是org.primefaces.component.TabViewRenderer。现在它工作正常:))