如何在Vaadin网格中只编辑一些列?

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

我相信Label不能用,因为它不是Field。

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

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

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

ATI

  getColumn(columnName).setEditable(true).setEditorField(getNoEditableField(columnName)); 

 private Field getNoEditableField(final String columnName) { CustomField 

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

 grid.getColumn("fullName").setEditable(false); 

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

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

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

有一个棘手的方法来做到这一点! 我刚刚发现了它。 所以,首先你需要使用带容器的网格,而不是直接添加行:

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

然后从MyBean中删除字段setter,除了您必须编辑的字段的setter。

我认为通过grid.setEditorEnabled(true);使网格成为可编辑的网格可以实现同样的grid.setEditorEnabled(true); 并禁用其他列的编辑选项,如grid.getColumn(columnName).setEditable(false); 。 但我不确定这种方法的任何缺点。 任何建议总是受到赞赏。

我使用以下方法获取只读字段,技巧是覆盖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); } } 

它只是简单地转到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);