DropDownChoiceで全て選択
DropDownChoiceの選択項目として「全て選択」を例外的に追加したい場合がある。
nullで代用する方法もある
「すべてのXXX」などを表示させるシーンではsetNullValid(true)を使用して表示させました。
http://koohzi.sakura.ne.jp/blog/?p=55
が、今回の場合はPageParametersにidを渡したいのでうまくいかなかった。
PageParametersのaddはnullを受け付けない。他と揃えるためにも何らかのInteger型変数を渡したい。
また、選択値が何も指定されていない場合(始めてページを開いたとき)と全て選択を選んだときを区別したい場合もnullで代用できない。
そこで取りあえず -1 を特殊な値として登録してみる。
一見うまくいくが、setRequiredをtrueにしているのに -1 の項目を選択したときだけ「選択してください」のメニューが出る。他の項目を選んだら消える。
原因は AbstractSingleSelectChoice にあった。
public abstract class AbstractSingleSelectChoice<T> extends AbstractChoice<T, T> { private static final long serialVersionUID = 1L; /** String to display when the selected value is null and nullValid is false. */ private static final String CHOOSE_ONE = "Choose One"; protected static final Object NO_SELECTION_VALUE = "-1"; private static final String EMPTY_STRING = ""; /** whether or not null will be offered as a choice once a nonnull value is saved */ private boolean nullValid = false;
- 1 が選択無しの値として使われている。他にも空の文字が特殊な値として使われている。
ということで、何か特別な値を使うときには id を -1 以外、表示文字列を空文字以外にする必要がある。