Wicket - DropDownChoice с выбранным объектом
У меня проблема с DropDownChoice. Я должен предварительно выбрать элемент, но каждый учебник и пример, который я нашел, рассматривают только список примитивных типов.
У меня есть список объектов.
class myObject {
private String name;
private String surname;
[setter and getter]
}
В другом классе
List<MyObject> myList = some_data_retrieve();
MyObject defaultValue = some_simple_data_retrieve();
Для построения DropDownChoice im используется следующий конструктор:
final DropDownChoice<T> ddc = new DropDownChoice<T>(id, data, new ChoiceRenderer<T>(choiceRendererExpression, choiceRendererIdExpression));
В этом случае:
final DropDownChoice<myObject> ddc = new DropDownChoice<myObject>("wicket_id", myList, new ChoiceRenderer<myObject>("name", "surname"));
Сейчас. В каждом уроке / примере они используют другой конструктор с моделью. Например:
private static final List<String> SEARCH_ENGINES = Arrays.asList(new String[] {
"Google", "Bing", "Baidu" });
private String selected = "Google";
DropDownChoice<String> listSites = new DropDownChoice<String>(
"sites", new PropertyModel<String>(this, "selected"), SEARCH_ENGINES);
Я пытался что-то вроде этого, чтобы подражать такого рода вызов:
final DropDownChoice<myObject> ddc = new DropDownChoice<myObject>("wicket_id", new PropertyModel<myObject>(this,"defaultValue"),myList, new ChoiceRenderer<myObject>("name", "surname"));
Но я получил ошибку:
No get method defined for class: package$WicketPage expression: defaultValue
Пожалуйста, помогите мне понять.
Спасибо
2 ответа
Это означает, что вам нужно добавить метод получения и установки вашего "defaultValue" на странице или компоненте, где вы добавляете DropDownChoice.
public class MyPage extends WebPage {
private MyObject defaultValue;
public MyPage(PageParameters pageParameters) {
super(pageParameters);
defaultValue = some_simple_data_retrieve();
List<MyObject> myList = some_data_retrieve();
add(new DropDownChoice<myObject>(
"wicket_id",
new PropertyModel<MyObject>(this,"defaultValue"),
myList,
new ChoiceRenderer<MyObject>("name", "surname")
);
}
public MyObject getDefaultValue() {
return defaultValue;
}
public void setDefaultValue(MyObject defaultValue) {
this.defaultValue = defaultValue;
}
}
PropertyModel
хороший выбор для таких проблем. MyObject
является объектом и имеет строку name
Я переопределил toString()
Метод в нем, чтобы назвать, и он работает правильно. Я предлагаю использовать этот метод.
topicDropDown = new DropDownChoice<MyObject>("wicktID", new PropertyModel<MyObject> (this.object, "exp"), new LoadableDetachableModel<List<MyObject>>() {
@Override
protected List<MyObject> load() {
return top.getAllObjects();
}