Adding a delete button to a table column

Can I add a delete button to a table cell?

I have a table with 5 columns, I would like to add a 6th column. I want the 6th column to have a delete button in each row.

Example line:

| 10002 | part | Metal | 001 | Yes | Remove |

Thus, the user can delete any unwanted lines by simply clicking a button.

I have a markup column in a table and a ComboBox . I created a class that extends EditingSupport .

Do I need to make another class extending EditingSupport , but creating a button instead of a ComboBox ?

EDIT

 public class AplotDataTableViewer extends TableViewer { public AplotDataTableViewer(Composite parent, int style) { super(parent, style); Table table = getTable(); GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true); table.setLayoutData(gridData); createColumns(); table.setHeaderVisible(true); table.setLinesVisible(true); setContentProvider(new ArrayContentProvider()); } private void createColumns() { String[] titles = { "ItemId", "RevId", "PRL", "Dataset Name", "EC Markup" }; int[] bounds = { 150, 150, 100, 150, 100 }; TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0], 0); col.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { if(element instanceof AplotDataModel.AplotDatasetData) return ((AplotDataModel.AplotDatasetData)element).getDataset().toString(); return super.getText(element); } }); col = createTableViewerColumn(titles[1], bounds[1], 1); col.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { if(element instanceof AplotDataModel.AplotDatasetData) return ((AplotDataModel.AplotDatasetData)element).getRev().toString(); return super.getText(element); } }); col = createTableViewerColumn(titles[2], bounds[2], 2); col.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { if(element instanceof AplotDataModel.AplotDatasetData) return ((AplotDataModel.AplotDatasetData)element).getPRLValue().toString(); return super.getText(element); } }); col = createTableViewerColumn(titles[3], bounds[3], 3); col.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { if(element instanceof AplotDataModel.AplotDatasetData) return ((AplotDataModel.AplotDatasetData)element).getDatasetName().toString(); return super.getText(element); } }); col = createTableViewerColumn(titles[4], bounds[4], 4); col.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { if(element instanceof AplotDataModel.AplotDatasetData) return ((AplotDataModel.AplotDatasetData)element).getMarkupValue(); return super.getText(element); } }); col.setEditingSupport(new OptionEditingSupport(this)); } private TableViewerColumn createTableViewerColumn(String header, int width, int idx) { TableViewerColumn column = new TableViewerColumn(this, SWT.LEFT, idx); column.getColumn().setText(header); column.getColumn().setWidth(width); column.getColumn().setResizable(true); column.getColumn().setMoveable(true); return column; } } 

EDIT

 col = createTableViewerColumn(titles[5], bounds[5], 5); col.setLabelProvider(new ColumnLabelProvider() { @Override public void update(ViewerCell cell) { TableItem item = new TableItem(getTable(),SWT.NONE); Button button = new Button(getTable(),SWT.NONE); button.setText("X"); getControl().setBackground(item.getBackground()); TableEditor editor = new TableEditor(getTable()); editor.grabHorizontal = true; editor.grabVertical = true; editor.setEditor(button , item, columnIndex); editor.layout(); } }); 
+7
source share
4 answers

Here is an example of a working version.

 public class TableEditorTest { /** * @param args */ public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new FillLayout()); TableViewer viewer = new TableViewer(shell); viewer.getTable().setHeaderVisible(true); viewer.getTable().setLinesVisible(true); viewer.setContentProvider(new ArrayContentProvider()); TableColumn column = new TableColumn(viewer.getTable(), SWT.NONE); column.setText("First Name"); column.setWidth(100); TableViewerColumn firstNameCol = new TableViewerColumn(viewer, column); firstNameCol.setLabelProvider(new ColumnLabelProvider(){ @Override public String getText(Object element) { Person p = (Person)element; return p.getFirstName(); } }); column = new TableColumn(viewer.getTable(), SWT.NONE); column.setText("Last Name"); column.setWidth(100); TableViewerColumn lastNameCol = new TableViewerColumn(viewer, column); lastNameCol.setLabelProvider(new ColumnLabelProvider(){ @Override public String getText(Object element) { Person p = (Person)element; return p.getLastName(); } }); column = new TableColumn(viewer.getTable(), SWT.NONE); column.setText("Actions"); column.setWidth(100); TableViewerColumn actionsNameCol = new TableViewerColumn(viewer, column); actionsNameCol.setLabelProvider(new ColumnLabelProvider(){ //make sure you dispose these buttons when viewer input changes Map<Object, Button> buttons = new HashMap<Object, Button>(); @Override public void update(ViewerCell cell) { TableItem item = (TableItem) cell.getItem(); Button button; if(buttons.containsKey(cell.getElement())) { button = buttons.get(cell.getElement()); } else { button = new Button((Composite) cell.getViewerRow().getControl(),SWT.NONE); button.setText("Remove"); buttons.put(cell.getElement(), button); } TableEditor editor = new TableEditor(item.getParent()); editor.grabHorizontal = true; editor.grabVertical = true; editor.setEditor(button , item, cell.getColumnIndex()); editor.layout(); } }); Person p1 = new Person(); p1.setFirstName("George"); p1.setLastName("Burne"); Person p2 = new Person(); p2.setFirstName("Adam"); p2.setLastName("Silva"); Person p3 = new Person(); p3.setFirstName("Nathan"); p3.setLastName("Cowl"); List<Person> persons = new ArrayList<Person>(); persons.add(p1); persons.add(p2); persons.add(p3); viewer.setInput(persons); shell.open(); while(!shell.isDisposed()) { if(!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } private static class Person { String firstName; String lastName; Person() { } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } public void setFirstName(String firstName) { this.firstName = firstName; } public void setLastName(String lastName) { this.lastName = lastName; } } } 
+19
source

In addition to the answer from @ sambi.reddy, there is a comment that reads: “make sure you select these buttons when changing the viewer's input”. This is what I had to do for this part to work.

The structure used was the implementation of IStructuredContentProvider, so in the overridden inputChanged (...) I had to enter the following code: -

 @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // This will dispose of all the control button that were created previously if (((TableViewer)viewer).getTable() != null && ((TableViewer)viewer).getTable().getChildren() != null) { for (Control item : ((TableViewer)viewer).getTable().getChildren()) { // at this point there are no other controls embedded in the viewer, however different instances may require more checking of the controls here. if ((item != null) && (!item.isDisposed())) { item.dispose(); } } } } 

This works fine unless you have an update table (i.e. viewer.setInput (List)) as a result of a button action. When I added this, the following line sometimes returned buttons that still existed but were removed:

 if(buttons.containsKey(cell.getElement())) 

So I needed to update this line:

 if (buttons.containsKey(cell.getElement()) && !buttons.get(cell.getElement()).isDisposed()) 

This led to the re-creation of any placement buttons, if they are still needed.

+2
source

One important thing for the selected answer is that you should not create an instance of TableEditor every time the update method is called, it slows down the performance or even makes the application unacceptable.

 @Override public void update(ViewerCell cell) { TableItem item = (TableItem) cell.getItem(); Button button; if(buttons.containsKey(cell.getElement())) { button = buttons.get(cell.getElement()); } else { button = new Button((Composite) cell.getViewerRow().getControl(),SWT.NONE); button.setText("Remove"); buttons.put(cell.getElement(), button); TableEditor editor = new TableEditor(item.getParent()); editor.grabHorizontal = true; editor.grabVertical = true; editor.setEditor(button , item, cell.getColumnIndex()); editor.layout(); } } 
+1
source

Below code should work for you

 TableItem item = (TableItem) item; Button button = new Button(table,swt.none); button.setText("Remove"); control.setBackground(item.getBackground()); TableEditor editor = new TableEditor(table); editor.grabHorizontal = true; editor.grabVertical = true; editor.setEditor(button , item, columnIndex); editor.layout(); 
0
source

All Articles