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

时间:2013-04-04 16:55:00

标签: vaadin

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

table.addGeneratedColumn("name", new NameGeneratedColumn());
table.addGeneratedColumn("classification", new ClassificationGeneratedColumn());
table.addGeneratedColumn("variation", new VariationGeneratedColumn());

点击修改按钮后,我想使classification列可编辑。 在buttonClick方法中收到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;
        }
    });

并添加了table.setEditable(true),它不会影响任何内容,因为表中只生成了列。 它甚至没有输入createField方法。

2 个答案:

答案 0 :(得分:2)

据我所知,生成的列不会传递给现场工厂。 您可以添加带有“分类”ID的普通String列,然后添加具有相同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);

答案 1 :(得分:1)

使用ColumnGenerator的{​​{1}}方法创建所需的可编辑组件。此方法在其参数中同时获得generateCellitemId,因此您可以检查给定单元格是否处于可编辑状态。您需要自己跟踪此状态,当然,只需在某处保留propertyId

您需要调用表格的Object editedItemId方法才能生效。 From its Javadoc:

  

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

     

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