我在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
方法。
答案 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}}方法创建所需的可编辑组件。此方法在其参数中同时获得generateCell
和itemId
,因此您可以检查给定单元格是否处于可编辑状态。您需要自己跟踪此状态,当然,只需在某处保留propertyId
。
您需要调用表格的Object editedItemId
方法才能生效。 From its Javadoc:
需要这种情况的典型情况是更新生成器(例如CellStyleGenerator)并希望确保使用新样式重绘行。
请注意,调用此方法并不便宜,因此请避免不必要地调用它。