Как сделать редактируемыми только некоторые столбцы в сетке 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);