チェックボックスに初期値(デフォルトでチェック)を入れる方法

[Java][Wicket]チェックボックスに初期値(デフォルトでチェック)を入れる方法

 Wicket奮闘記第一弾。とりあえず、Wicket開発で一番困った所、CheckGroupとCheckコンポーネントを使用したチェックボックスに初期値=チェックを入れておく処理です。

 何かユーザ情報を登録するフォームがあってー、入れましたー、編集ボタンを押して編集画面に行きましたー、すると、

[f:id:kk_Ataka:20090309171545p:image]

 最初からこう、チェックが入っていてほしいという状況です。

 テキストのフォーム(TextField)なら、第二引数にDBから引っ張ってきたものを突っ込んでやればこんな感じで表示できるのですが、

[f:id:kk_Ataka:20090309162050p:image]

 チェックボックスはもう少しやらなきゃいけないことがあるみたい……。

//第二引数がユーザが持っている値
CheckGroup checkGroup = new CheckGroup("checkGroup", /*ユーザが持っているもののリスト*/);
//第二引数が選択項目の値
ListView listView = new ListView("list", /*選択肢のリスト*/) {
    private static final long serialVersionUID = 2972646917485688487L;
    @Override
    protected void populateItem(ListItem listItem) {
        listItem.add(new Check("check", listItem.getModel()));
            listItem.add(new Label("value", listItem.getModelObjectAsString()));
    }
};

 Javaはこう。で、htmlはこうしてみました。

<table>
    <span wicket:id="checkGroup">
        <tr>
            <th>なんとか一覧</th>
        </tr>
        <tr wicket:id="list">
            <td>
                <input type="checkbox" wicket:id="check" />
                <span wicket:id="value" />
            </td>
        </tr>
    </span>
</table>

 これらから生成されるページはこうなります。

[f:id:kk_Ataka:20090309171545p:image]

 このように、チェックボックスにデフォルトでチェックを入れる方法がわからなかったので、色々試してみました。まず、CheckGroupの第二引数にはユーザが選択した値が入ります。上の図で言うと、りんご・もも・すいか・めろん・つくねがユーザが選択しているものです。チェックが入っているから。

 次に、ListViewの第二引数には、選択項目の一覧が入ります。りんご・みかん・もも・すいか・なし・めろん・かき・ぐれーぷふるーつ・つくねがpopulateItemのCheckコンポーネントに一つずつbindされます。

 どうも、このCheckコンポーネントがbindされる時に、”CheckGroupの第二引数のリストとequalsをとっている”ようです。equalsならチェックと。

 populateItem内では、まずりんごbindする時に、ユーザが持っている{りんご・もも・すいか・めろん・つくね}と比較します。ユーザはりんごを持っているのでチェック。次にみかんを{りんご・もも・すいか・めろん・つくね}と比較します。みかんは持っていないのでチェックは入らない……という事を繰り返します。

 なので、CheckGroupに入っているリストのオブジェクトと、Checkでbindするオブジェクトは同じでなければチェックは入らないと思います。最初、DBから選択項目をとってきーの、次にユーザが持っているものをとってきーのして比較したら当然チェックが入らず。仕方ないので、選択項目をまるっととってきて、ユーザが選択した項目はそこからコピーしてequalsが成立するようにしました……。

 とりあえず、チェックが入るようにはなったけど、絶対もっといい方法があると思うなぁ。暫定的な解決方法という事で。

hayassh

こんにちは

複数のチェックボックスを使う場合はCheckBoxMultipleChoiceを使ってはいかがでしょうか。
必ずCheckGroupとCheckを使用しないといけないという状況下であったらゴメンナサイ・・

private List selected = new ArrayList();

public FooPage() {
Form form = new Form(“form”);
add(form);

//初期値のセット
selected.add(new Company(1, “Company1”));
selected.add(new Company(2, “Company2”));

//チェックボックスの項目全て
final List all = Arrays.asList(new Company(1, “Company1”), new Company(2, “Company2”), new Company(3, “Company3”));

CheckBoxMultipleChoice multiChoice = new CheckBoxMultipleChoice(“list”,
new PropertyModel(FooPage.this, “selected”),all ,new ChoiceRenderer(“companyName”, “companyId”));

form.add(multiChoice);
form.add(new Button(“next”));
}

上記のようにChoiceRendererを使用した場合、
ChoiceRendererのコンストラクタの第2引数に指定した値(この場合だとCompanyオブジェクトのcompanyIdというフィールド)でのequalsにてデフォルトのチェックが判定されるので特別なオブジェクトのフィールドでなければ期待した動作になるかと思います。
(上記の場合だとCompany1とCompany2にデフォルトでチェックが入ります)
また、CheckBoxMultipleChoiceで実装すると項目名とチェックボックスのHTMLでの関連付け(Labelタグのfor属性)も自動で行ってくれます。
上記の場合だとブラウザ上でCompany1という文字列をクリックしてもチェックボックスにチェックが入るようになります。

長々と書いてしまいましたが既にご存知だったり蛇足だったらすみません(^^;)

1236741842

kk_Ataka

こんにちは。
特にCheckGroupとCheckを使用しなければならないという事ではなかったので、早速試させていただきました。
これは便利ですね! 単純にCheckBoxMultipleChoiceコンポーネントを知らなかったので、使用経験のあったCheckGroupとCheckでゴリ押ししていたのですが、ソースコードがかなり減りました。
ご指摘ありがとうございます。とても参考になりました^^

1236776036