Xpages 如何以编程方式构建控件?

Xpages 如何以编程方式构建控件?,xpages,lotus-domino,Xpages,Lotus Domino,我用Java编写了自定义控件。为了简单起见,我们假设它如下所示: public class HelloworldControl extends UIComponentBase { @Override public void decode(FacesContext context) { String cid = this.getClientId(context); ... super.decode(context); }

我用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 world文本下呈现一个视图

我该怎么做?动态构建控件的标准过程是什么


简单地说,我希望以编程方式构建标准组件的层次结构,并将其附加到控件。

您可以通过直接在EncodeBeagin方法中创建UIComponent来实现这一点:

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

编辑: 托比样本的答案更好。我已经取消了这个答案,因为它仍然有效,但我并不自豪。要将uiText添加到组件树,必须使用this.getChildren().add(uiText)方法


最好使用f.e.这里描述的自己的渲染器类:

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

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


希望这能有所帮助。

你说的“Hello world文本下的视图”是什么意思?我试着尽可能地向前迈进-我的意思是示例中的HelloWorld控件显示Hello world文本(其编码开始代码中)我希望它动态加载一个视图控件,并强制它在encodeBegin和encodeEnd之间进行渲染。添加渲染器如何解决我的问题?我想用标准渲染器创建标准组件的层次结构。添加渲染器不会解决您的问题。但是使用标准机制(实现renderer类)将有助于生成的组件仍然与XPages兼容。。。如果您不确定类名要做什么,请查看此网站,其中显示了所有IBM公共和扩展库控件及其类名和属性:
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);
    }