いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Tapestry奮闘記-0025 (Select, Optionコンポーネント)

Tapestyにて、コンボボックス(ドロップダウンリスト)を表示するには、
大きく分けて2通りのやり方があります。

  1. Selectコンポーネントを使用
  2. PropertySelection(MultiplePropertySelection)コンポーネントを使用

後、自前でコンポーネントを作成してレンダリングというのもありますが
それは置いといて。

今回、Selectコンポーネントを使用してみます。
Selectコンポーネントだけでは、コンボはできますが、中身のレンダリング
できません。内側でOptionコンポーネントを使用します。

Optionコンポーネントは選択されているかどうかのboolean値を持ちます。

処理的には、Optionを表すコレクションを作成し、Selectコンポーネント
内側でForを使用してループしながらOptionをレンダリングします。

以下サンプルです。

[HTMLテンプレート]

                    <!--
                    
                        Selectコンポーネントを使用する.
                        (Select, Optionコンポーネントを使用。)

                    -->
                    <br/>
                    <hr/>
                    <div id="select_component_001" align="center">
                        <b>
                            Selectコンポーネントを使用<br/>
                            <br/>
                            Select, Optionコンポーネントを使用。<br/>
                            <br/>
                        </b>
                        <br/>
                        出力:
                        <br/>
                        <form jwcid="selectSample001@Form" listener="listener:selectSample001FormSubmit">
                            <select jwcid="select001@Select" multiple="ognl:false">
                                <span jwcid="@For" source="ognl:select001ValueList" value="ognl:currentSelect001Value" index="ognl:currentSelect001Index">
                                    <option jwcid="@Option" selected="ognl:select001OptionValueList[currentSelect001Index]" label="ognl:currentSelect001Value"></option>
                                </span>
                            </select>
                            <input type="submit" value="実行"/>
                        </form>
                        <br/>
                        <br/>
                    </div>
                    <hr/>
                    <br/>

[javaファイル]

//
// 必要なゲッターとセッターの定義
//
    public abstract List<String> getSelect001ValueList();
    public abstract void setSelect001ValueList(List<String> values);

    public abstract String getCurrentSelect001Value();
    public abstract void setCurrentSelect001Value(String value);

    public abstract int getCurrentSelect001Index();
    public abstract void setCurrentSelect001Index(int index);

    public abstract boolean getSelect001OptionValueList();
    public abstract void setSelect001OptionValueList(boolean selectionList);

//
// 初期化部分
//
    public void pageBeginRender(PageEvent event){

        List<String> select001Values = new ArrayList<String>();
        select001Values.add("");
        for(int i = 0; i < 5; i++){
            select001Values.add(String.format("select_value_%d", i));
        }

        this.setSelect001ValueList(select001Values);
        this.setSelect001OptionValueList(new boolean[this.getSelect001ValueList().size()]);
    }


//
// FORMがサブミットされた際のリスナ
//
    public void selectSample001FormSubmit(IRequestCycle cycle){
        System.out.println(Arrays.toString(this.getSelect001OptionValueList()));
    }

リストと同じサイズのboolean配列を持っているところがポイントです。
画面にて、コンボの項目が選択され、ボタンが押下されると該当するboolean配列の
要素がtrueになっていることが確認できます。

結構、ゴリゴリ感がありますね。

実際は、Select,Optionコンビを使用するよりも、PropertySelectionを使用するほうが
多くなると思います。次は、PropertySelectionを使用してみます.