我遇到了getModelObject问题。它返回null。实际上模型概念对我来说并不清楚。代码是:
public class SpaceCheckListWindow extends WebPage {
private SpaceCheckListForm spaceCheckListForm;
private Page parentPage;
private ModalWindow modalWindow;
public SpaceCheckListWindow(Page parentPage, final ModalWindow modalWindow) {
this.parentPage = parentPage;
this.modalWindow = modalWindow;
String[] labels = new String[] {
"a",
"b",
"c",
"d",
"e",
"f"
};
List<ListMemeber> list = new ArrayList<ListMemeber>();
for(String label : labels) {
list.add(new ListMemeber(label));
}
addComponent(list);
}
private void addComponent(List<ListMemeber> list) {
spaceCheckListForm = new SpaceCheckListForm("form", list);
add(spaceCheckListForm);
}
private class SpaceCheckListForm extends Form {
private static final long serialVersionUID = 1L;
public SpaceCheckListForm(String id, final List<ListMemeber> list) {
super(id);
ListView listView = new ListView("listView", list) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem listItem) {
ListMemeber member = (ListMemeber) listItem.getModelObject();
listItem.add(new Label("label", member.getLabel()));
listItem.add(new CheckBox("checkbox", new PropertyModel(member, "selected")));
}
};
listView.setReuseItems(true);
add(listView);
AjaxButton submitBtn = new AjaxButton("submitBtn", this) {
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit(AjaxRequestTarget target, Form form) {
System.out.println(spaceCheckListForm.getModelObject());
modalWindow.close(target);
}
};
add(submitBtn);
}
}
private class ListMemeber implements Serializable {
private String label;
private Boolean selected = Boolean.FALSE;
public ListMemeber(String label) {
this.label = label;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public Boolean getSelected() {
return selected;
}
public void setSelected(Boolean selected) {
this.selected = selected;
}
@Override
public String toString() {
return label + Boolean.toString(selected);
}
}
}
现在onClick AjaxButton它返回null。我想获取标签和相应的复选框值。我该怎么做才能得到它?任何信息对我都非常有帮助。谢谢。
答案 0 :(得分:3)
您的组件层次结构如下所示:
SpaceCheckListWindow
SpaceCheckListForm (id: form)
ListView (id: listView)
ListItem (id: <generated by wicket>)
Label (id: label)
CheckBox (id: checkbox)
AjaxButton (id: submitBtn)
在Wicket中,每个组件都可能有一个模型,用于存储它显示/操作的数据。此模型通常传递给构造函数中的组件。如果没有发生这种情况,则使用空模型初始化组件(这本身不是错误)。但是在您的代码中,您的表单是使用空模型创建的,并且没有任何内容可以更新模型,因此getModelObject()
将始终返回null。这也不是错误,您的表单本身不必具有模型对象。
此处唯一具有非平凡模型的组件是CheckBox
,它会按原样读取/更新selected
ListMemeber
字段。 (更新:当然你的Label
也有一个非空模型,但标签只读取他们的模型,从不更新它。)
总而言之:这段代码并没有根本错误,你只是在错误的地方寻找结果:不是注销表单的模型对象,而是列出selected
字段所有列表成员都可以在您提交表单时查看更改内容。
关于Wicket模型的一些额外阅读:Working with Wicket models