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 world テキストのすぐ下にビューをレンダリングする子ビュー コントロールが必要です。

これどうやってするの?コントロールを動的に構築するための標準的な手順は何ですか?

簡単に言えば、標準コンポーネントの階層をプログラムで構築し、それを自分のコントロールにアタッチしたいのです。

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 に答える