3

我在 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)which 不会影响任何内容,因为表上只有生成的列。它甚至没有进入createField方法。

4

2 回答 2

2

据我所知,生成的列不会传递给现场工厂。您也许可以添加一个具有“分类”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);
于 2013-04-05T15:57:08.577 回答
1

ColumnGenerator在'sgenerateCell方法中创建您需要的可编辑组件。此方法同时获取参数itemIdpropertyId参数,因此您可以检查给定单元格是否处于可编辑状态。当然,您需要自己跟踪此状态,只需保留一个位置即可Object editedItemId

您需要调用refreshRowCache表的方法才能使其正常工作。从它的Javadoc:

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

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

于 2013-08-26T14:20:10.050 回答