Wicketでセレクトボックス


 Wicketでセレクトボックスを表示する場合、Web上を見てみると、WicketExampleもそうなんだけど、こんな感じのサンプルが多い。

List list = Arrays.asList(new String[]{"One", "Two", "Three"});
DropDownChoice choices = new ListChoice("choices",list);


これでもいいんだけど、こんな感じ↓(<option>タグのvalueに任意の値を入れる)にするには・・・って言うことが書いてあるところが見つからなくてちょっとハマッってたので、ここに残しておきます。

<select>
    <opeion value="code1" >One</>
    <opeion value="code2" >Two</>
    <opeion value="code3" >Three</>
</select>



まず、<Option>タグにあたるクラスを作ります。codeが<option>タグのvalue属性にあたり、valueが<option>タグのボディにあたります。

public class SelectOption implements Serializable{

    private String _code;    
    private String _value;   
	
    public SelectOption(final String code, final String value){
        _code = code;
        _value = value;
    }
	
    public final String getCode(){
        return _code;
    }

    public final String getValue(){
        return _value;
    }
	
}


 これを選択肢分リスト化してDropDownChoiceにぶち込むわけなんですけど、DropDownChoiceの方ではSelectOptionクラスなんて勝手クラス知りませんので、SelectOptionクラスが<option>タグのvalueとボディとどう紐付くのか分からなくて困ってしまいます。なんでChoiceRendererというクラスで教えます。コンストラクタで指定しているのが、Listに入っているSelectOptionクラスのgetValue(),getCode()にあたる部分です。

List list = new ArrayList();
list.add(new SelectOption("code1", "One"));
list.add(new SelectOption("code2", "Two"));
list.add(new SelectOption("code3", "Three"));

DropDownChoice choices = 
    new DropDownChoice("choices", list, new ChoiceRenderer("value","code"));


 ってここまで書いてWeb検索していたら、ここにそのまんまの事が書いてあった・・・
 
 http://cwiki.apache.org/WICKET/dropdownchoice-examples.html

追記 2010/02/24

 はまったので追記

 この方法でボタンのイベントなんかで、選択した値をとる場合は、普通にDropDownChice#getModelObject()で先で設定したSelectOptionオブジェクトが取れる。だけど、設定する際の注意として、上記のコードだと、Modelオブジェクトを設定していないので、以下のようなメッセージでエラーになる。

WicketMessage: Method onFormSubmitted of interface org.apache.wicket.markup.html.form.IFormSubmitListener targeted at component [MarkupContainer [Component id = form, page = Pageクラスの完全修飾名, path = 0:form.Form, isVisible = true, isVersioned = true]] threw an exception
Root cause:
     java.lang.IllegalStateException: Attempt to set model object on null model of component: form:DropDownChoiceの変数名
     at org.apache.wicket.Component.setModelObject(Component.java:2877)     
     at org.apache.wicket.markup.html.form.FormComponent.updateModel(FormComponent.java:1069)     
     at org.apache.wicket.markup.html.form.Form$19.validate(Form.java:1806)
     
         ... 以下省略
        
        
         


 これは、単純に上記のコードの場合、DrowDownChoiceには、選択肢は設定したけど、モデルオブジェクトが設定されていないので、イベント発生時時に選択肢を保存する場所(モデル)が見つからなくて怒っているらしい。なので、どこかでsetModel()をする必要がある。

List list = new ArrayList();
list.add(new SelectOption("code1", "One"));
list.add(new SelectOption("code2", "Two"));
list.add(new SelectOption("code3", "Three"));

DropDownChoice choices = 
    new DropDownChoice("choices", list, new ChoiceRenderer("value","code"));
choices.setModel(new Model());   <--- これ!これ!忘れないでね。

  ...省略