2018年以降の記事はGitHub Pagesに移行しました

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

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

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

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

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

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

//第二引数がユーザが持っている値
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>

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

 このように、チェックボックスにデフォルトでチェックを入れる方法がわからなかったので、色々試してみました。まず、CheckGroupの第二引数にはユーザが選択した値が入ります。上の図で言うと、りんご・もも・すいか・めろん・つくねがユーザが選択しているものです。チェックが入っているから。
 次に、ListViewの第二引数には、選択項目の一覧が入ります。りんご・みかん・もも・すいか・なし・めろん・かき・ぐれーぷふるーつ・つくねがpopulateItemのCheckコンポーネントに一つずつbindされます。
 どうも、このCheckコンポーネントがbindされる時に、"CheckGroupの第二引数のリストとequalsをとっている"ようです。equalsならチェックと。

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

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

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