Wicket:getModelObject返回null

时间:2011-02-18 12:44:18

标签: java wicket

我遇到了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。我想获取标签和相应的复选框值。我该怎么做才能得到它?任何信息对我都非常有帮助。谢谢。

1 个答案:

答案 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