Как сделать редактируемыми только некоторые столбцы в сетке Vaadin?
сетка Vaadin позволяет определить как редактируемую с помощью
grid.setEditorEnabled(true);
это делает все видимые столбцы для редактирования. Однако я не хочу, чтобы пользователь редактировал определенный столбец, но похоже, что редактируемый-это все или ничего.
следующее лучшее решение, которое я нашел, - это определить поле редактора с отключенным редактором, что почти делает трюк, но пользователь все еще может выбрать текст и переместить курсор (но поле не редактируется больше.)
Grid.Column nameColumn = grid.getColumn("fullName");
nameColumn.setHeaderCaption("Full Name");
nameColumn.setEditorField(getNoEditableTextField());
...
private Field<?> getNoEditableTextField() {
TextField noEditableTextFiled = new TextField();
noEditableTextFiled.setEnabled(false);
return noEditableTextFiled;
}
Я считаю, что метка не может использоваться, потому что это не поле.
есть ли лучший вариант для достижения этого?
edit: как сказал aakath, есть способ достичь этого, не позволяя редактировать столбец, но при этом значение ячейки исчезает при редактировании строки, что нежелательно.
7 ответов
мое решение ниже. я только что закончил. это не было проверено слишком много. но это может дать вам некоторые идеи.
ati
getColumn(columnName).setEditable(true).setEditorField(getNoEditableField(columnName));
...
private Field<?> getNoEditableField(final String columnName) {
CustomField<Label> result = new CustomField() {
@Override
protected Component getContent() {
Label result = (Label) super.getContent();
Object editedItemId = getEditedItemId();
String value = DEFAULT_VALUE;
if (editedItemId != null) {
value = CustomizableGrid.this.toString(getContainerDataSource().getItem(editedItemId).getItemProperty(columnName).getValue());
}
result.setValue(value);
return result;
}
@Override
protected Component initContent() {
Label result = new Label(DEFAULT_VALUE, ContentMode.HTML);
result.setDescription(getColumnDescription(columnName));
result.setStyleName("immutablegridcellstyle");
return result;
}
@Override
public Class getType() {
return Label.class;
}
};
result.setConverter(new Converter<Label, Object>() {
//converter for your data
});
return result;
}
вы пытались позвонить setEditable(false)
метод в столбце? Я считаю, что это должно сделать поле не редактируемым, когда редактор элементов активен.
grid.getColumn("fullName").setEditable(false);
У меня была та же проблема, и я не хотел, чтобы нажатие на столбец id открывало редактор. Я решил это, добавив ItemClickListener, как показано ниже. Мне это подходит.
grid.addItemClickListener((ItemClickListener<GridBean>) event -> grid.getEditor().setEnabled(!event.getColumn().getCaption().equals("Id")));
также byc щелчок по определенной сетке столбцов больше не редактируется.
есть один хитрый способ сделать это! Я только что узнал. Итак, прежде всего вам нужно использовать сетку с контейнером, а не прямые строки, добавляющие:
BeanItemContainer<MyBean> container = new BeanItemContainer<>(MyBean.class);
setContainerDataSource(container);
затем удалите сеттеры полей из MyBean, кроме сеттеров для полей, которые вам нужно отредактировать.
Я думаю, что то же самое можно достичь, сделав сетку редактируемой по grid.setEditorEnabled(true);
и отключение опции редактирования для других столбцов, таких как grid.getColumn(columnName).setEditable(false);
. Но я не уверен в каких-либо недостатках этого метода. Любое предложение всегда приветствуется.
Я использую следующий подход для получения поля только для чтения, трюк переопределяет метод setEnabled для получения отключенного текстового поля. Если вы отслеживаете исходный код в сетке Vaadin, независимо от того, какое поле вы передаете сетке, оно всегда будет вызывать поле.setEnabled (true).
myGrid.getColumn(propertyId).setEditorField(new ReadOnlyField());
и
public class ReadOnlyField extends TextField
{
public ReadOnlyField()
{
super();
this.setReadOnly(true);
}
@Override
public void setEnabled(boolean enabled)
{
// always set to disabled state
super.setEnabled(false);
}
}
его просто перейти к документации Vaadin, что сделал из него ниже: вы можете увидеть здесь я дал указанный имя столбца
grid = new Grid<>();
lst = new ArrayList<>();
provider = new ListDataProvider<>(lst);
lst.add(new Company(1, "Java"));
grid.setDataProvider(provider);
grid.addColumn(Company::getSerialNo).setCaption("Sr.no");
TextField tf = new TextField();
grid.getEditor().setEnabled(true);
HorizontalLayout hlyt = new HorizontalLayout();
grid.addColumn(Company::getName).setEditorComponent(tf, Company::setName).setCaption("Name").setExpandRatio(2);
hlyt.addComponent(grid);