无法使用Vaadin将文本字段链接到SQLContainer的RowItem

时间:2016-08-04 07:29:12

标签: java mysql vaadin

我正在使用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);
    }
});

因此,如您所见,表单链接到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);
}

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

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

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

另外,如果我想创建一个新行,我想有类似的东西

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

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

非常感谢。

1 个答案:

答案 0 :(得分:0)

最后,我要说我要么正确使用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);
}