我正在建立一个以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);
}