我正在使用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是接口。那么如何在填充其内容之前实例化容器的空行?
非常感谢。
答案 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);
}