2012-09-18 10 views
7

Czy można dodać przycisk Usunąć do komórki w tabeli?Dodawanie przycisku usuwania do kolumny w tabeli

Mam tabelę z 5 kolumnami, chciałbym dodać 6 kolumnę. Chcę, aby szósta kolumna miała przycisk usuwania w każdym rzędzie.

Przykład Row:

| 10002 | część | Metal | 001 | Tak | Usuń |

W ten sposób użytkownik może usunąć niechciane wiersze, klikając przycisk.

Mam kolumnę znaczników w tabeli i jest to ComboBox. Stworzyłem klasę, która rozszerza EditingSupport.

Czy muszę utworzyć kolejną klasę rozszerzającą EditingSupport, ale tworząc przycisk zamiast 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(); 
     } 
     }); 

Odpowiedz

19

Oto próbka wersję pracy.

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

Proszę nie zamieszczać wielu odpowiedzi. Możesz edytować poprzednią odpowiedź za pomocą linku "edytuj" znajdującego się pod nią. – Baz

+0

O mój boże, dziękuję! – wuppi

0

poniższy kod powinien działać dla ciebie

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

Gdzie dodajesz ten kod? Czy to idzie w kodzie klasy TableViewer?Dodam powyższy kod do klasy tableviewer. Czy możesz mi pokazać, jak to dodać? – jkteater

+1

Należy zastąpić \t ColumnLabelProvider.update (komórka ViewerCell) dla tableviewercolumn, w której chcesz wyświetlić ten przycisk. Z ViewerCell można uzyskać getItem, getColumnIndex. Upewnij się, że śledzisz przyciski, które tworzysz dla każdego obiektu wiersza, i usuwaj je po zmianie wprowadzanych przez widzów. Zachowaj przyciski na mapie dla każdego wiersza danych, przed utworzeniem jakiegokolwiek przycisku sprawdź, czy jest już na mapie. –

+0

Przykro mi, ale mam problemy z włączeniem twojej porady do mojego kodu. Muszę przeczytać więcej o ViewerCells – jkteater

1

Jedną ważną rzeczą do wybranego odpowiedź jest taka, że ​​nie należy utworzyć instancję TableEditor na każdej metody aktualizacji nazywają ją spowolni wydajność, a nawet sprawić, że aplikacja unresposnive.

@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

Oprócz odpowiedź od @ sambi.reddy nie jest komentarz, który mówi - „upewnij się wyrzucać tych przycisków, gdy wejście widz zmienia”. To właśnie musiałem zrobić, aby ta część działała.

Ramy Kiedyś miał implementację IStructuredContentProvider, więc w zastąpionej inputChanged (...) miałem umieścić w poniższym kodzie: -

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

Działa to dobrze, z wyjątkiem, jeśli masz odświeżyć tabelę (np. viewer.setInput (List)) wywołanie w wyniku działania przycisku użytkownika. Kiedy dodałem to następujący wiersz czasem powrócił przyciski, które nadal istniały, ale były usuwane:

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

Więc potrzebne do aktualizacji tej linii to:

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

co spowodowało żadnych przycisków rozstrzygających bycia odtworzone, jeśli nadal były wymagane.

Powiązane problemy