如何在Vaadin中创建可编辑的生成列?

如何在Vaadin中创建可编辑的生成列?,vaadin,Vaadin,我在Vaadin中有一个表,它有3个生成的列。但是,我希望其中一个是可编辑的。因此,该表有以下列: table.addGeneratedColumn("name", new NameGeneratedColumn()); table.addGeneratedColumn("classification", new ClassificationGeneratedColumn()); table.addGeneratedColumn("variation", new VariationGenerat

我在Vaadin中有一个表,它有3个生成的列。但是,我希望其中一个是可编辑的。因此,该表有以下列:

table.addGeneratedColumn("name", new NameGeneratedColumn());
table.addGeneratedColumn("classification", new ClassificationGeneratedColumn());
table.addGeneratedColumn("variation", new VariationGeneratedColumn());
当我点击编辑按钮时,我想使
分类
列可编辑。 在
按钮内单击
方法,该方法接收我试图实现的
ClickEvent

table.setTableFieldFactory(new TableFieldFactory() {

        @Override
        public Field createField(Container container, Object itemId, Object propertyId, Component uiContext) 
            TextField tx = new TextField();
            tx.focus();
            tx.setWidth("90%");
            return tx;
        }
    });
并添加了
表。setEditable(true)
,它不会影响任何内容,因为表上只有生成的列。
它甚至没有进入
createField
方法。

据我所知,生成的列不会传递给字段工厂。 您可以添加一个具有“classification”id的普通字符串列,然后添加具有相同id的生成列。您甚至可能需要在设置表格可编辑时删除生成的列

像这样的方法应该会奏效:

    final Table t = new Table();
    t.addContainerProperty("classification", String.class, null);
    final ColumnGenerator generator = new ColumnGenerator() {
        @Override
        public Object generateCell(Table source, Object itemId,
                Object columnId) {
            return "1";
        }
    };
    t.addGeneratedColumn("classification", generator);
    t.addItem();
    t.addItem();
    layout.addComponent(t);
    Button button = new Button("editable", new ClickListener() {

        @Override
        public void buttonClick(ClickEvent event) {
            t.setEditable(!t.isEditable());
            if (t.isEditable())
                t.removeGeneratedColumn("classification");
            else
                t.addGeneratedColumn("classification", generator);
        }
    });
    layout.addComponent(button);

ColumnGenerator
generateCell
方法中创建所需的可编辑组件。此方法在其参数中获取
itemId
propertyId
,因此您可以检查给定单元格是否处于可编辑状态。当然,您需要自己跟踪这种状态,只需在某处保留一个
对象editemid

您需要调用表的
refreshRowCache
方法才能使其工作

需要这样做的典型情况是更新生成器(例如CellStyleGenerator)并希望确保使用新样式重新绘制行

请注意,调用此方法并不便宜,因此请避免不必要地调用它