我正在建立一个以MySql数据库为后端的简单CRUD应用程序。到目前为止,我设法通过FreeformQuery将网格链接到SQLContainer的内容(这样就可以了)。

    String query = "select a.id, a.name name, b.name type from asset a join " +
 " assettype b on a.assettype_id = b.id";

grid.setContainerDataSource(container);


对于容器,SQLContainer。我创建了一个表单,并在其内容和选定的行之间进行了绑定

grid.addSelectionListener(event -> {
    if (event.getSelected().isEmpty()) {
        form.setVisible(false);
    } else {
        Item item = container.getItem(event.getSelected().iterator().next());
        form.setAsset(item);
    }
});


因此,如您所见,表单链接到一个项目。 setAsset只是一个表单方法,它将行内容链接到表单的文本字段。

public void setAsset(Item item) {
    this.item = item;
    FieldGroup binder = new FieldGroup(this.item);
    binder.bind(textField1, "name");
    binder.bind(textField2, "type");
    setVisible(true);
}


好吧,我不再知道如何添加行或如何编辑现有行。为了编辑行,我尝试使用表单的save方法(用按钮调用),如下所示

private void save() throws UnsupportedOperationException, SQLException  {
    SQLContainer container = db.getContainer();
    container.addItem(item);
    container.commit();
}


好吧,问题之一是,如果我选择一个网格项目,我会在文本字段中看到name和type的内容,但是,如果在输入save方法之前在文本字段中修改了它们的值,则this.item仍然具有原始内容。值(当我认为它将文本字段中的新值,因为文本字段绑定到RowItem时)。有人知道发生了什么吗?

另外,如果我想创建一个新行,我想要这样的东西

    Button createAsset = new Button("Add asset");
    createAsset.addClickListener(e ->
    {
        grid.select(null);
        form.setAsset(new Item());
    });


并在将其推送到表之前,在表单中填充空白Item()的内容。当然不能,因为Item和RowItem是接口。那么如何在填充其内容之前实例化该容器的空行呢?

首先十分感谢。

最佳答案

最后,我要说的是要么我没有正确使用FieldGroup.bind方法,要么其中有一个错误。这是我的原始条目

public void setAsset(Item item) {
    this.item = item;
    FieldGroup binder = new FieldGroup(this.item);
    binder.bind(textField1, "name");
    binder.bind(textField2, "type");
    setVisible(true);
}


哪个无效,这就是有效的(对我来说,是相同的)

public void setAsset(Item item) {
        this.item = item;
        textField1.setPropertyDataSource(item.getItemProperty("name"));
        textField2.setPropertyDataSource(item.getItemProperty("type"));
        setVisible(true);
}

07-24 09:44
查看更多