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

时间:2012-06-08 11:48:56

标签: xpages lotus-domino

我有用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世界文本下呈现视图。

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

简单地说 - 我想以编程方式构建标准组件的层次结构,我想将它附加到我的控件上。

2 个答案:

答案 0 :(得分:4)

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

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

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

希望有所帮助。

答案 1 :(得分: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)方法。

最好使用自己的渲染器类,如f.e.在这里:XPages Extensibility API > Creating a Java Control in an NSF