我想在 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 的覆盖方法。你能告诉我问题可能出在哪里吗?