Java Wicket:getModelObject返回null

Java Wicket:getModelObject返回null,java,wicket,Java,Wicket,我在getModelObject方面遇到了麻烦。它正在返回null。实际上,模型的概念对我来说并不清楚。代码是: public class SpaceCheckListWindow extends WebPage { private SpaceCheckListForm spaceCheckListForm; private Page parentPage; private ModalWindow modalWindow; public SpaceCheckListWindow(Page pa

我在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);
    }
}
公共类SpaceCheckListWindow扩展网页{
私有SpaceCheckListForm SpaceCheckListForm;
私人网页父网页;
私有ModalWindow ModalWindow;
公共空间检查列表窗口(页面父页面,最终ModalWindow ModalWindow){
this.parentPage=parentPage;
this.modalWindow=modalWindow;
字符串[]标签=新字符串[]{
“a”,
“b”,
“c”,
“d”,
“e”,
“f”
};
列表=新的ArrayList();
用于(字符串标签:标签){
添加(新的ListMemeber(标签));
}
添加组件(列表);
}   
私有void addComponent(列表){
spaceCheckListForm=新的spaceCheckListForm(“表格”,列表);
添加(spaceCheckListForm);
}
私有类SpaceCheckListForm扩展了表单{
私有静态最终长serialVersionUID=1L;
公共空间检查列表表单(字符串id,最终列表){
超级(id);
ListView ListView=新建ListView(“ListView”,列表){
私有静态最终长serialVersionUID=1L;
@凌驾
受保护的void populateItem(ListItem ListItem){
ListMemeber成员=(ListMemeber)listItem.getModelObject();
添加(新标签(“Label”,member.getLabel());
添加(新复选框(“复选框”,新属性模型(成员,“选定”));
}
};
setReuseItems(true);
添加(列表视图);
AjaxButton submitBtn=新的AjaxButton(“submitBtn”,this){
私有静态最终长serialVersionUID=1L;
@凌驾
提交时受保护的void(AjaxRequestTarget目标,表单){
System.out.println(spaceCheckListForm.getModelObject());
modalWindow.close(目标);
}
};
增加(提交);
}
}
私有类ListMemeber实现可序列化{
私有字符串标签;
所选私有布尔值=Boolean.FALSE;
公共ListMemeber(字符串标签){
this.label=标签;
}
公共字符串getLabel(){
退货标签;
}
公共void setLabel(字符串标签){
this.label=标签;
}
公共布尔getSelected(){
返回选中的;
}
已选择公共无效设置(已选择布尔值){
this.selected=selected;
}
@凌驾
公共字符串toString(){
返回标签+布尔.toString(选中);
}
}
}


现在单击AjaxButton它将返回null。我想得到标签和相应的复选框值。我该怎么做才能得到它?任何信息都会对我很有帮助。谢谢。

您的组件层次结构如下所示:

SpaceCheckListWindow  
 SpaceCheckListForm (id: form)
  ListView (id: listView)
   ListItem (id: <generated by wicket>)
    Label (id: label)
    CheckBox (id: checkbox)
  AjaxButton (id: submitBtn)
spacechecklist窗口
SpaceCheckListForm(id:form)
ListView(id:ListView)
ListItem(id:)
标签(id:标签)
复选框(id:CheckBox)
AjaxButton(id:submitBtn)
在Wicket中,每个组件可能都有一个模型,用于存储其显示/操作的数据。此模型通常传递给构造函数中的组件。如果没有发生这种情况,则使用空模型初始化组件(这本身不是错误)。但是在代码中,表单是用空模型创建的,并且也没有任何东西可以更新模型,因此
getModelObject()
将始终返回null。这也不是一个错误,表单本身不必有模型对象

这里唯一一个具有非平凡模型的组件是
复选框
,它可以读取/更新
ListMemeber
所选
字段。(更新:当然,您的
标签也有一个非空模型,但标签只读取其模型,从不更新。)

总而言之,这段代码没有什么根本性的错误,你只是在错误的地方寻找结果:与其注销表单的模型对象,不如列出所有列表成员的
选中的
字段,看看提交表单时有什么变化


一些关于Wicket型号的附加阅读:

感谢您提供详细说明。我看到模型通常是POJO。现在,如果我想创建这样一个类作为表单的模型。如何在其中插入listview?对于文本字段或复选框,它将是字符串或布尔值,不是吗!那么listview呢,我应该声明一个列表及其getter和setter吗?那么toString方法是什么呢?在上面的问题中,如果我调用listview.getmodelobject,那么它将正常工作。谢谢你帮助我。