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所说,有一种方法可以实现这一目标,不能对列进行编辑,但这样做时,单元格值会在编辑行时消失,这是不可取的。
答案 0 :(得分:6)
您是否尝试在列上调用setEditable(false)
方法?我相信当项目编辑器处于活动状态时,它应该使该字段不可编辑。
grid.getColumn("fullName").setEditable(false);
答案 1 :(得分:2)
我的解决方案如下。我刚刚完成。它没有经过太多测试。但它可能会给你一些想法。
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;
}
答案 2 :(得分:2)
我遇到了同样的问题,并且不想点击id列打开编辑器。我通过添加如下的ItemClickListener解决了这个问题。它对我来说很好。
grid.addItemClickListener((ItemClickListener<GridBean>) event -> grid.getEditor().setEnabled(!event.getColumn().getCaption().equals("Id")));
此外,通过点击特定列,网格不再可编辑。
答案 3 :(得分:1)
有一种棘手的方法可以做到这一点!我刚发现它。 因此,首先您需要使用带容器的网格,而不是直接添加行:
BeanItemContainer<MyBean> container = new BeanItemContainer<>(MyBean.class);
setContainerDataSource(container);
然后从MyBean中删除字段setter,除了你必须编辑的字段的setter。
答案 4 :(得分:1)
我认为通过grid.setEditorEnabled(true);
使网格成为可编辑网格并禁用grid.getColumn(columnName).setEditable(false);
等其他列的编辑选项,可以实现同样的目标。但我不确定这种方法的任何缺点。任何建议总是受到赞赏。
答案 5 :(得分: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);
答案 6 :(得分: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);
}
}