Search code examples
javavaadinvaadin7vaadin-grid

How to make only some columns editable in a Vaadin Grid?


Vaadin Grid allows to be defined as editable with

grid.setEditorEnabled(true);

This makes all visible columns editable. However I don't want the user to edit an specific column, but seems like the editable is an all or nothing.

The next best solution I have found is to define an editor field with a disabled editor, which almost does the trick but the user is still able to select the text and move the cursor (but the field is not editable anymore).

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

I believe Label cannot be used because it's not a Field.

Is there a better option to achieve this?

edit: as aakath said, there is a way of achieving this not enabling the column to be edited, but in doing so the cell value disappears when you edit the row, which is not desirable.


Solution

  • my solution is below. i have just finished. it was not tested too much. but it may give you some ideas.

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