DropDownChoiceとModelのvalue
DropDownChoiceをつかってハマったこと。
DropDownChoiceにsetChoises(IModel choices)でBeanを設定した場合で、かつvalidatorを設定している状況。
この状態で、FormをsubmitするとFormComponentのvalidate()が実行されるが、そのときvalidatorがチェックする値が、setChoisesで設定したBeanになってしまうのです。
DropDownChoiceにvalidatorを設定する意味ないけど、たとえばPatternValidatorとかを設定していると、PatternValidatorがStringを期待しているのにBeanが渡されて、ClassCastExcepionで死亡。
とりあえず、DropDownChoiseのconvertChoiceIdToChoice(String id)をOverrideして、引数のidをそのまま返すように対応しました。
final List<?> list = jdbcManager.from( entityClass )
.orderBy( idCol )
.getResultList();
DropDownChoice choice = new DropDownChoice( id ){
@Override
protected Object convertChoiceIdToChoice(String id)
{
return id;
}
};なんでこんなことになったかというと、S2jdbcで検索したentityをそのまま
DropDownChoiseに設定していたからです。
なんていうか、まだComponentとModelの関係を理解してないことがバレバレ。
ボタンによってFormのValidationを有効・無効にする方法
AjaxButtonなんかで、フォームのデータは送りたいけどvalidationはしたくないって場合があります。
たとえば、Textboxの横に検索ボタンとかをつけて、Ajaxで検索ダイアログを表示するとか。
そんな時は、ButtonクラスのsetDefaultFormProcessing(boolean defaultFormProcessing)をfalseで設定すればよし。
このメソッドは、戻り値として自分自身をthisで返すので、Buttonクラスを継承した無名クラスを生成している場合でも、末尾にこのメソッドを呼び出してあげればOK。
CheckBoxMultipleChoiceの<br/>
最近Wicketで遊んでます。
CheckBoxMultipleChoiceを利用すると、Checkboxを出力した後<br/>が出て縦に並んでいやーんってなる場合があります。
そんな時には、CheckBoxMultipleChoice#setSuffix( String suffix)してあげましょう。
CheckBoxMultipleChoiceでは、onComponentTagBodyメソッドが呼ばれたときに、設定されているsuffixを最後に追加します。で、デフォルトのsuffixが<br/>なので、縦にならぶってわけ。