Калитка - Как использовать ListView в пользовательском компоненте формы?
Я пытаюсь реализовать пользовательский компонент формы, который содержит ListView.
Мой пользовательский компонент формы:
public class NotificationDataListPanel extends FormComponentPanel {
private ListView<NotificationDataBean> listView = null;
public NotificationDataListPanel(String id) {
this(id, null);
}
public NotificationDataListPanel(String id, List list) {
super(id);
listView = new ListView<NotificationDataBean>("listView") {
@Override
protected void populateItem(final ListItem<NotificationDataBean> item) {
final NotificationDataPanel dataPanel = new NotificationDataPanel("dataPanel", new Model<NotificationDataBean>() {
@Override
public NotificationDataBean getObject() {
return item.getModel().getObject();
}
@Override
public void setObject(final NotificationDataBean value) {
item.setModelObject(value);
}
});
item.add(dataPanel);
}
};
add(listView);
add(new AjaxLink("addNewNDPanel") {
@Override
public void onClick(AjaxRequestTarget target) {
List<NotificationDataBean> modelObject = listView.getModelObject();
if (modelObject == null) {
modelObject = new ArrayList<NotificationDataBean>();
}
modelObject.add(new NotificationDataBean());
listView.setModelObject(modelObject);
target.add(this);
}
});
}
@Override
protected void onBeforeRender() {
super.onBeforeRender();
List<NotificationDataBean> modelObject = (List<NotificationDataBean>) getModelObject();
if (modelObject != null && !modelObject.isEmpty()) {
listView.setModelObject(modelObject);
} else {
listView.setModel(new Model());
}
}
@Override
protected void convertInput() {
List<NotificationDataBean> modelObject = listView.getModelObject();
setConvertedInput(modelObject);
updateModel();
}
}
NotificationDataPanel
отлично работает в формах сам по себе, и с другой стороны, я мог бы использовать его в ListView
в формах (не в отдельном компоненте формы).
Работает отлично:
final Form form = new Form("form", new CompoundPropertyModel(testFormBean));
final ListView<NotificationDataBean> strs = new ListView<NotificationDataBean>("notiL") {
@Override
protected void populateItem(final ListItem<NotificationDataBean> item) {
final NotificationDataPanel quxField = new NotificationDataPanel("str", new Model<NotificationDataBean>() {
@Override
public NotificationDataBean getObject() {
return item.getModel().getObject();
}
@Override
public void setObject(final NotificationDataBean value) {
item.setModelObject(value);
}
});
item.add(quxField);
}
};
form.add(strs);
Но когда я пытался использовать его в ListView
в отдельном компоненте формы я получил это исключение.
Last cause: No get method defined for class: class TestFormBean expression: listView
НЕ ХОРОШО
final Form form = new Form("form", new CompoundPropertyModel(testFormBean));
form.add(new NotificationDataListPanel("notiL"));
А также TestFormBean
учебный класс:
class TestFormBean implements Serializable {
List<NotificationDataBean> notiL;
}
Слово listView в исключении относится к ListView
идентификатор в NotificationDataListPanel
,
Заранее благодарим за советы, как это исправить, и примите мои извинения за мой плохой английский.
1 ответ
Вы не предоставляете модель для своего ListView, поэтому он будет искать модель в иерархии компонентов. CompountPropertyModel передает модели дочерним компонентам и использует их идентификатор для поиска свойства в своей модели.
Вы, вероятно, просто хотите сделать:
new ListView<NotificationDataBean>("listView", list);