Ни для кого не секрет, что vaadin таблицу можно сделать редактируемой, если вызвать метод table.setEditable(true) и наоборот. В этом случае редактировать можно все ячейки.
Но что, если необходимо редактировать ячейки только одной колонки? Например так:
Форумы и «Book of Vaadin» подсказывают, что надо использовать TableFieldFactory. Например: https://vaadin.com/book/-/page/components.table.html, параграф «Navigation in Editable Mode».
Собственно, примерно так должен выглядеть код:
// создаем таблицу и определяем ее колонки
Table table = new Table();
table.addContainerProperty("num", Integer.class, null);
table.addContainerProperty("name", String.class, null);
table.addContainerProperty("age", String.class, null);
// переопределяя метод создания редактируемых полей, мы просто
// указываем конкретную колонку или колонки, для которых надо
// создавать эти самые поля
table.setTableFieldFactory(new TableFieldFactory() {
@Override
public Field createField(Container c, Object itemId,
Object propertyId, Component uiContext) {
TextField field = null;
if ("age".equals(propertyId)) {
field = new TextField((String) propertyId);
field.setWidth("100%");
}
return field;
}
});
// а это позволит проверить работоспособность примера по
// двойному нажатию мышки на табличке
table.addListener(new ItemClickEvent.ItemClickListener() {
@Override
public void itemClick(ItemClickEvent event) {
if (event.isDoubleClick()) {
table.setEditable(!table.isEditable());
}
}
});
// осталось заполнить таблицу данными и запустить приложение
int index = 1;
table.addItem(new Object[]{index, "Nathan Fielding", 41}, index++);
table.addItem(new Object[]{index, "John Smith", 26}, index++);
table.addItem(new Object[]{index, "Jane Hill", 88}, index++);
table.addItem(new Object[]{index, "John Sheridan", 32}, index++);
table.addItem(new Object[]{index, "Marc Torvalds", 40}, index++);
table.addItem(new Object[]{index, "Sarah Richards", 34}, index++);
table.addItem(new Object[]{index, "Peter Fielding", 85}, index++);
table.addItem(new Object[]{index, "Lenny Sheridan", 32}, index++);
table.addItem(new Object[]{index, "Lenny McGoff", 70}, index++);
table.addItem(new Object[]{index, "John Halas", 72}, index++);