我正在尝试实现一个包含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
ID。
提前感谢您提供有关如何解决此问题的任何提示,请接受我对我糟糕英语的道歉。
答案 0 :(得分:2)
您没有为ListView提供模型,因此它将在组件层次结构中搜索一个模型。 CompountPropertyModel为子组件提供模型,并使用它们的id在模型上查找属性。
您可能只想这样做:
new ListView<NotificationDataBean>("listView", list);