1

JSF コンポーネントのSelectOneRadioレイアウトは非常に限られているため、カスタム レンダラーを作成しましたが、うまく機能します。ただし、標準の SelectOneRadio レイアウトも使用したい場合があります。そこで、私が作成したカスタム Renderer を利用する新しいコンポーネントを作成することにしましたが、この新しいコンポーネントに の機能を反映させたいのですがSelectOneRadio、唯一の違いは、私の Renderer を使用することです。この場合、両方を作成して my を使用する必要がありcustom tagますcustom componentcustom renderer? classからすべての機能を取得するには、何を拡張する必要がありSelectOneRadioますか? いくつかのコードを提供していただければ幸いです。

EDIT
@BalusC: の値を検出しlayoutて正しいレンダラーを委譲するというあなたのアイデアが気に入っています。したがって、layout="div_layout" がある場合はうまく機能しますがpageDirection、またはlineDirectionである場合は何も表示されません。私がしたことは次のとおりです。クラスを作成し、メソッドextends MenuRendererをオーバーライドencodeEndするので、そこでこれを行いました

String layout = (String) component.getAttributes().get("layout");

if(layout != null){
        if(layout.equals(PAGE_DIRECTION) || layout.equals(LINE_DIRECTION)){
            super.encodeEnd(context, component);
            return;
        } else if (!layout.equals(DIV_LAYOUT)){
            //Throw error message
        }
}
//Continue with my own renderer code

EDIT2
何も表示されないと言ったとき、私は間違っていました。super.encodeEnd(コンテキスト、コンポーネント); レンダリングしましたが、ラジオをレンダリングする代わりに、select optionタグをレンダリングします。そのため、間違ったレンダラーに委譲しているようです。MenuRenderer の代わりに RadioRenderer を使用する必要があります。

4

1 に答える 1

3

独自のWebアプリケーションに固有の場合は、レンダラーだけを置き換えることができます。最も簡単なのは、実装固有のレンダラーを拡張し、標準属性の1つの値(layout最良の選択)に応じて、実装固有のレンダラーに委任するか、独自のカスタムレンダリングジョブを実行することです。

私はクロサギの場合、次のように拡張com.sun.faces.renderkit.html_basic.RadioRendererして登録したいと思います

<renderkit>
    <renderer>
        <component-family>javax.faces.SelectOne</component-family>
        <renderer-type>javax.faces.Radio</renderer-type>
        <renderer-class>com.example.ExtendedRadioRenderer</renderer-class>
    </renderer>
</renderkit>

実装に依存しないようにしたい場合は、レンダラーの実装全体を自分で作成する必要があります。

カスタムコンポーネントが必要な場合は、自分で作成する必要があります。

于 2012-07-07T23:38:37.557 に答える