Wicketで複数選択のチェックボックス

前回の続き

複数のチェックボックスをひとまとめで取得したいっていう話。

メッセージ送信機能で、送信先のユーザーをチェックボックスで指定させたい。モデルはこんな感じ。

public class Message{
   private String title;
   private String text;
   private List<User> sendTo;

   ....
}

このモデルのsendToにチェックされたユーザーだけを格納するListがセットされてほしい。

で、ページクラスで以下のようにしてみる。

//ページクラスにモデルを設定
this.setDefaultModel(new CompoundPropertyModel<Message>(new Message()));

...


//送信対象のユーザーを取得する		
List<User> users = this.userService.findAll();

//複数選択チェックボックスを作る
final CheckBoxMultipleChoice<User> userList = new CheckBoxMultipleChoice<User>("sendTo",
				users,
				new ChoiceRenderer<User>("userName","userId"));

ChoiceRenderクラスはDropDownのときにもでてきたけど、要はUserクラスのどのプロパティをlabel、valueに設定するか決めるためのクラス。
この場合は、userNameがlabel、userIdがvalueになるので以下のように出力される。

<input type="check" value="user_id_001" id="user_id_001"/><label for="user_id_001">taka</label>

結局value値でどれがチェックされたかってのをCheckBoxMultipleChoiceクラスの内部で振り分けてるので、valueに出力される値はユニークにならなければいけない。。。なのでIDなどのプロパティを指定する。

submit時に以下のようにすると

form.add(new Button("submit"){
   @Override
   public void onSubmit() {

      Message message = (Message)this.getPage().getDefaultModelObject();
      List<User> sendTo = message.getSendTo();

      }
   });

選択されたユーザーのみが格納されたListが取得できる。

CheckBoxMultipleChoice#setRequired(true)ってすると選択されてない場合エラーになるのかなぁ?帰ったら試してみよう。

その他にもCheckGroupクラスとかもあったけどこっち使った方が楽だったりして。。。試してないけど。。。

以上。