Vaadin 无法放弃在TableFieldFactory中的字段中所做的更改

Vaadin 无法放弃在TableFieldFactory中的字段中所做的更改,vaadin,vaadin7,Vaadin,Vaadin7,我有一个简单的表,其中使用IndexedContainer作为数据源显示一些数据。 我希望我的用户能够编辑其中一些数据,因此我使用TableFieldFactory(DefaultFieldFactory)生成这些可编辑的列(属性) 现在,如果用户处于编辑模式(table.setEditable(true))并且已经更改了一些字段,那么他或她应该能够放弃这些更改-为此,我有一个“取消”按钮。这个“取消”按钮应该放弃自用户进入编辑模式后在表格生成字段中所做的所有更改,然后是setEditable(

我有一个简单的表,其中使用IndexedContainer作为数据源显示一些数据。 我希望我的用户能够编辑其中一些数据,因此我使用TableFieldFactory(DefaultFieldFactory)生成这些可编辑的列(属性)

现在,如果用户处于编辑模式(table.setEditable(true))并且已经更改了一些字段,那么他或她应该能够放弃这些更改-为此,我有一个“取消”按钮。这个“取消”按钮应该放弃自用户进入编辑模式后在表格生成字段中所做的所有更改,然后是setEditable(false)——现在一切都应该是调用setEditable(true)之前的样子

这听起来并不难,直到我尝试实现它

如果我正确理解表与容器与TableFieldFactory的功能,则会发生以下情况:

  • 属性被添加到容器中
  • 容器被设置为表数据源
  • 用户单击“编辑表格”按钮(Table.setEditable(true))
  • 该表调用TableFieldFactory的重写createField()方法
  • createField()方法创建可编辑字段

  • 用户编辑字段,同时通过跟踪工厂中创建的字段(并缓冲这些字段),更新容器,然后您可以根据需要提交/放弃

    我在中创建了一个缓冲表编辑的简单示例。选择一行并单击“编辑”(或双击)。进行更改,然后单击保存/按Enter键提交,或单击取消/转义键放弃


    我故意一次只编辑一行,因为坦率地说,这是唯一对我有意义的事情。显然,这很容易改变。

    我在attachListeners中使用了您的示例,效果非常好!谢谢你,查尔斯!我正试图弄清楚attachListeners是如何工作的,但我很难在API中找到任何好的材料,甚至在谷歌搜索时也很难找到。如果我理解正确的话,应该是这样的:1。附加和分离侦听器将添加到字段2中。当字段附加到表中时,字段列表3中会添加一个“连接器字段”(相当于参考?)。当对字段列表中的“字段引用”调用commit()时,该字段将被提交(如果调用了discard,则会被丢弃)。如果您能确认这一点,我将不胜感激!当组件连接到DOM或从DOM分离时,只需调用附加/分离侦听器。组件/字段是一种连接器。所以-我只是简单地在字段被连接/分离时跟踪它们。提交/放弃按钮仅提交/放弃所有附加字段。
    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;
        }
    });