如何在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);