7

Vaadin Grid 允许定义为可编辑

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;
}

我相信不能使用标签,因为它不是字段。

有没有更好的选择来实现这一目标?

编辑:正如 aakath 所说,有一种方法可以实现这一点,但不能编辑列,但这样做时,当您编辑行时,单元格值会消失,这是不可取的。

4

7 回答 7

6

您是否尝试setEditable(false)在列上调用方法?我相信当项目编辑器处于活动状态时,它应该使该字段不可编辑。

grid.getColumn("fullName").setEditable(false);
于 2015-06-18T05:04:29.613 回答
3

我的解决方案如下。我刚刚完成。它没有经过太多测试。但它可能会给你一些想法。

阿提

  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;
}
于 2015-07-08T18:36:38.780 回答
2

我有同样的问题,不希望点击 id 列打开编辑器。我通过添加如下所示的 ItemClickListener 解决了它。这对我来说可以。

grid.addItemClickListener((ItemClickListener<GridBean>) event -> grid.getEditor().setEnabled(!event.getColumn().getCaption().equals("Id")));

此外,通过单击特定列 Grid 不再可编辑。

于 2017-07-04T08:39:38.330 回答
1

There is one tricky way to do it! I've just found out it. So, first of all you need to use grid with container, instead of direct rows adding:

BeanItemContainer<MyBean> container = new BeanItemContainer<>(MyBean.class);
setContainerDataSource(container);

Then remove fields setters from MyBean, except setters for fields what you have to edit.

于 2015-06-29T12:44:11.343 回答
1

我认为通过使网格成为可编辑的网格grid.setEditorEnabled(true);并禁用其他列(如grid.getColumn(columnName).setEditable(false);. 但我不确定这种方法有什么缺点。任何建议都会受到赞赏。

于 2016-10-13T11:34:33.927 回答
1

它很简单,只需转到 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);
于 2017-09-21T08:00:09.510 回答
0

我使用以下方法来获取只读字段,诀窍是覆盖 setEnabled 方法以获取禁用的文本字段。如果您在 Vaadin Grid 中跟踪源代码,无论您将什么字段传递给 Grid,它都将始终调用 field.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);
    }
}
于 2015-12-15T05:36:05.790 回答