2012-09-18 25 views
7

Ist es möglich, eine Schaltfläche zu einer Zelle in einer Tabelle hinzufügen?Hinzufügen einer Schaltfläche zum Entfernen einer Spalte in einer Tabelle

Ich habe eine Tabelle mit 5 Spalten, ich möchte eine 6. Spalte hinzufügen. Ich möchte, dass die 6. Spalte in jeder Zeile eine Schaltfläche zum Entfernen enthält.

Beispiel Reihe:

| 10002 | Teil | Metall | 001 | Ja | Entfernen |

Auf diese Weise kann der Benutzer alle unerwünschten Zeilen entfernen, indem Sie einfach auf die Schaltfläche klicken.

Ich habe eine Markup-Spalte in der Tabelle und es ist ComboBox. Ich habe eine Klasse erstellt, die EditingSupport erweitert.

Müsste ich eine andere Klasse erweitern EditingSupport, aber eine Schaltfläche statt ComboBox erstellen?

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

Antwort

19

Hier wird die Probe arbeiten arbeiten.

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

    } 


} 
+3

Bitte nicht mehrere Antworten posten. Sie können Ihre vorherige Antwort bearbeiten, indem Sie den Link "Bearbeiten" darunter verwenden. – Baz

+0

Oh mein Gott, danke! – wuppi

0

Im Folgenden Code sollte für Sie Version

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

Wo fügen Sie diesen Code hinzu? Geht das in den TableViewer-Klassencode?Ich werde meinen tableviewer Klassencode oben hinzufügen. Können Sie mir bitte zeigen, wie ich es hinzufügen kann? – jkteater

+1

Bitte überschreiben Sie \t ColumnLabelProvider.update (ViewerCell-Zelle) für Table Viewer Spalte, wo Sie diese Schaltfläche anzeigen möchten. Von ViewerCell können Sie getItem, getColumnIndex abrufen. Stellen Sie sicher, dass Sie die Schaltflächen, die Sie für jedes Zeilenobjekt erstellen, im Auge behalten und diese bei Änderungen der Viewer-Eingabe ablegen. Halten Sie für jede Rowdata Schaltflächen in einer Map bereit, bevor Sie einen Button erstellen, der bereits in der Map vorhanden ist. –

+0

Es tut mir leid, aber ich habe einige Probleme beim Versuch, Ihren Rat in meinen Code einzubauen. Ich muss mehr über ViewerCells lesen – jkteater

1

Eine wichtige Sache, auf die gewählte Antwort ist, dass Sie nicht eine Instanz von Tabelleneditor bei jedem Update-Methode aufrufen, er kann die Leistung verlangsamen schaffen sollte oder sogar die Anwendung unresposnive machen.

@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(); 
      } 
     } 
2

Neben der Antwort von @ sambi.reddy gibt es einen Kommentar, der sagt - „Sie diese Tasten, stellen Sie sicher entsorgen, wenn Zuschauer-Eingabe ändert“. Das musste ich tun, damit dieser Teil funktioniert.

Der Rahmen habe ich eine Implementierung von IStructuredContentProvider hatte, so in der überschriebenen inputChanged (...), i in den folgenden Code setzen musste: -

@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(); 
      } 
     } 
    } 
} 

Dies funktioniert gut, es sei denn, Sie haben Eine Aktualisierungstabelle (dh viewer.setInput (List)) wird als Ergebnis einer Schaltflächenaktion aufgerufen. Als ich hinzugefügt manchmal die folgenden Zeilen Tasten zurück, die noch existierte, aber entsorgt wurden:

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

Also brauchte ich diese Zeile zu aktualisieren, um zu sein:

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

, die in jeder Entsorgung Taste führten sein neu erstellt, wenn sie noch benötigt wurden.

Verwandte Themen