Search code examples
javaswtjfacetableviewer

Java TableViewer - change cell image on selection


I have followed Vogella's tutorial on Table Viewer and using the StyledCellLabelProvider presented there. It creates a CHECKED or UNCHECKED icon on the third column

    col = createTableViewerColumn(titles[3], bounds[3], 3);
    col.setLabelProvider(new ColumnLabelProvider() {
        @Override
        public String getText(Object element) {
            return null;
        }

        @Override
        public Image getImage(Object element) {
            if (((Person) element).isMarried()) {
                return CHECKED;
            } else {
                return UNCHECKED;
            }
        }
    });
    col.setEditingSupport(new MarriedEditingSupport(viewer));

The column images get painted accordingly when the table is created but how can I change the icon when the user clicks a cell ? (I want to simulate a check box)


Solution

  • You can use an EditingSupport class based on CheckboxCellEditor for this:

    class MarriedEditingSupport extends EditingSupport
    {
      private final CheckboxCellEditor _editor;
    
      MarriedEditingSupport(TableViewer viewer)
      {
        super(viewer);
    
        _editor = new CheckboxCellEditor(viewer.getTable());
      }
    
      @Override
      protected CellEditor getCellEditor(Object element)
      {
        return _editor;
      }
    
      @Override
      protected boolean canEdit(Object element)
      {
        return true;
      }
    
      @Override
      protected Object getValue(Object element)
      {
        return Boolean.valueOf(((Person)element).isMarried());
      }
    
      @Override
      protected void setValue(Object element, Object value)
      {
        ((Person)element).setMarried(((Boolean)value).booleanValue());
    
        getViewer().update(element, null);
      }
    }