5

我有用 Java 编写的自定义控件。为了简单起见,我们假设它看起来像这样:

public class HelloworldControl extends UIComponentBase {
    @Override
    public void decode(FacesContext context) {
        String cid = this.getClientId(context);
        ...
        super.decode(context);
    }

    @Override
    public void encodeBegin(FacesContext context) throws IOException {
        ResponseWriter writer = context.getResponseWriter();
        writer.writeText("Hello world!", this);
        // I want a view!!
    }

    @Override
    public void encodeEnd(FacesContext context) throws IOException {
         ResponseWriter writer = context.getResponseWriter();
         ...
    }

    public void restoreState(FacesContext context, Object state) {
        Object values[] = (Object[]) state;
        ...
        super.restoreState(context, values[0]); 
    }

    public Object saveState(FacesContext context) {
        Object values[] = ...
    }
}

我想以编程方式添加子控件。例如,我想要一个子视图控件在 Hellow 世界文本下呈现一个视图。

我怎样才能做到这一点?动态构建控件的标准程序是什么?

简而言之 - 我想以编程方式构建标准组件的层次结构,并且我想将它附加到我的控件上。

4

2 回答 2

4

我认为您正在寻找的答案是实现 FacesComponent 接口 Keith Strickland 在他的博客上发布了详细说明:

http://xprentice.gbs.com/A55BAC/keithstric.nsf/default.xsp?documentId=82770C11FA7B9B21852579C100581766

它使用 initBeforeContents、buildContents 和 initAfterContents 方法允许您添加子项。

希望有帮助。

于 2012-06-08T15:19:46.333 回答
1

您可以通过直接在您的encodeBegin方法中创建您的 UIComponent 来做到这一点:

public void encodeBegin(FacesContext context) throws IOException {
    ResponseWriter writer = context.getResponseWriter();

    writer.writeText("Hello world!", "");
    try{
        UIPassThroughText uiText= new UIPassThroughText();
        uiText.setText("Hello daddy!");
        uiText.encodeBegin(context);
        uiText.encodeChildren(context);
        uiText.encodeEnd(context);
    }

但我不认为这样做是一个好主意,因为那样你的子组件不会添加到组件树中......

编辑: Toby Samples 的答案是更好的答案。我已取消删除此答案,因为它仍然有效,但我并不为此感到自豪。要将uiText添加到组件树中,您必须使用this.getChildren().add(uiText)方法。

最好使用自己的渲染器类,如下所述:XPages Extensibility API > Creating a Java Control in an NSF

于 2012-06-08T13:19:33.933 回答