我有一个简单的表,其中我使用 IndexedContainer 作为数据源来呈现一些数据。我希望我的用户能够编辑其中的一些数据,因此我使用 TableFieldFactory (DefaultFieldFactory) 来生成这些可编辑的列(属性)。
现在,如果用户处于编辑模式 (table.setEditable(true)) 并且一直在更改某些字段,他或她应该能够放弃这些更改 - 为此,我有一个“取消”按钮。这个“取消”按钮应该放弃自用户进入编辑模式然后 setEditable(false) 以来在表格生成的字段中所做的所有更改 - 现在一切都应该是调用 setEditable(true) 之前的方式。
这听起来并不难,直到我尝试实现它。
如果我正确理解 Table 与 Container 与 TableFieldFactory 的功能,则会发生以下情况:
- 属性被添加到容器
- Container设置为Table数据源
- 用户单击“编辑表”按钮 (table.setEditable(true))
- Table 调用 TableFieldFactory 的重写 createField() 方法
- createField() 方法创建可编辑字段
- 用户编辑字段,同时容器得到更新 <-- 不是 100% 确定这个
- 用户单击“取消”按钮<-这是我的问题
问题:当我按下“取消”按钮时,我应该怎么做discard()?我不能做 table.discard(),因为改变已经发生了。我不能做 container.discard() 因为,是的,Container 接口不继承该方法。我不能执行 field.discard(),因为我无法从 createField() 方法之外访问字段。
我尝试了 setBuffered、markAsDirty、refreshRowCache 和 setImmediate 的不同变体,但均未成功。
这是(希望是所有)相关代码:
表格、容器和“取消”按钮(大致):
table.setContainerDataSource(container);
Button cancel = new Button("Cancel", new Button.ClickListener() {
private static final long serialVersionUID = 1L;
@Override
public void buttonClick(ClickEvent event) {
// table.setImmediate(false); //tried variations of this
// table.refreshRowCache(); //tried variations of this
// table.markAsDirty(); //tried variations of this
// table.setBuffered(true); //tried variations of this
// table.discard(); //tried this, but here it's too late
table.setEditable(false);
}
});
表场工厂:
table.setTableFieldFactory(new DefaultFieldFactory() {
private static final long serialVersionUID = 1L;
@Override
public Field<?> createField(Container container, Object itemId, Object propertyId, com.vaadin.ui.Component uiContext) {
TextField tField = (TextField) DefaultFieldFactory.get().createField(container, itemId, propertyId, uiContext);
tField.setImmediate(true);
if (propertyId.equals("Foo")) {
// field.setImmediate(true); //tried variations of this
// field.setBuffered(false); //tried variations of this
return tField;
}
else {
tField.setReadOnly(true);
}
return tField;
}
});