Wicket の Autocomplete は、AJAX の
org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField;
と、jQuery の
com.googlecode.wicket.jquery.ui.form.autocomplete.AutoCompleteTextField
がある。
今回は、jQuery の方、Maven の グループIDは、com.googlecode.wicket-jquery-ui で持ってきて使うケースである。
文字列 String の Autocomplete は簡単に作れるが、Java Bean の場合は、
ちょっと工夫が必要。
選択されたイベントで実行される AutoCompleteTextField の
onSelected をオーバライドして、
任意の Hidden フィールドに、表示しないキー値をセットするのである。
例えば、Item というクラスの Bean があったとして以下のようにする。
final HiddenField<String> hid = new HiddenField<String>("hid", new Model<String>());
final AutoCompleteTextField<Item> itemName = new AutoCompleteTextField<Item>("item", new Model<Item>()){
@Override
protected List<Item> getChoices(String input){
if (Strings.isEmpty(input)){
// キー入力が空の場合は、空リスト返す。
// Strings は、org.apache.wicket.util.string.Strings というマークアップ言語文字列を使うのに便利なもの
return Collections.emptyList();
}
return /* DBなどで LIKE検索した結果のリストを返す。*/
}
@Override
protected void onSelected(AjaxRequestTarget target){
Item item = this.getModelObject(); // ← this で持ってくる!
// hiddenフィールドにセットする。
target.appendJavaScript("$('#hid').val(" + Integer.toString(item.id) + ");");
}
};
後は、Form の onSubmit で、これらの Textfield は、final 宣言してるので、
好きに Hidden フィールドの Model 値を取得すれば良い。