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

时间:2013-09-23 07:33:00

标签: vaadin vaadin7

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

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

这听起来并不是很难,直到我尝试实施它。

如果我正确理解Table vs. Container与TableFieldFactory的功能,则会发生以下情况:

  1. 将属性添加到Container
  2. 将Container设置为表数据源
  3. 用户单击“编辑表”按钮(table.setEditable(true))
  4. Table调用TableFieldFactory的重写createField()方法
  5. createField()方法创建可编辑字段
  6. 用户编辑字段,同时Container更新< - 不是100%肯定这个
  7. 用户点击“取消”按钮< - 这是我的问题
  8. 问题:当我按下“取消”按钮时,我该怎么做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);
        }
    });
    

    TableFieldFactory:

    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;
        }
    });
    

1 个答案:

答案 0 :(得分:1)

通过跟踪工厂中创建的字段(并缓冲这些字段),您可以根据需要提交/放弃。

我在this self-contained GitHub Gist中创建了一个简单的缓冲表编辑示例。选择一行,然后单击编辑(或双击)。进行更改,然后单击Save / Hit Enter提交,或单击Cancel / Escape以放弃。

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