2012-09-18 38 views
7

是否可以添加按鈕刪除到表中的單元格?將刪除按鈕添加到表中的列中

我有一個5列的表,我想添加第6列。我希望第6列在每一行都有一個刪除按鈕。

例行:

| 10002 |部分|金屬| 001 |是| 刪除 |

這樣用戶可以通過點擊按鈕刪除任何不需要的行。

我在表中有一個標記列,它是ComboBox。我創建了一個擴展EditingSupport的類。

我需要再延長EditingSupport,但創建一個按鈕而不是ComboBox

編輯

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

編輯

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

回答

19

下面是示例工作版本應該工作。所選擇的答案

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

請不要發佈多個答案。您可以使用其下方的「編輯」鏈接編輯您以前的答案。 – Baz

+0

天啊,謝謝! – wuppi

0

下面的代碼爲你

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

你在哪裏添加該代碼?這是否在TableViewer類代碼中執行?我將在上面添加我的tableviewer類代碼。你能告訴我如何添加它。 – jkteater

+1

請替換\t ColumnLabelProvider.update(ViewerCell單元格),用於顯示此按鈕的tableviewercolumn。從ViewerCell你可以得到getItem,getColumnIndex。確保您跟蹤您爲每個行對象創建的按鈕,並在查看器輸入更改時處理它們。在創建任何按鈕之前,請將地圖中的按鈕保存在每個rowdata中,然後檢查它是否已經存在於地圖中。 –

+0

我很抱歉,但我有一些問題嘗試將您的建議納入我的代碼。我需要閱讀更多關於ViewerCells – jkteater

1

一個重要的事情是,你不應該在每次更新方法創建TableEditor的實例,調用它會減慢性能,甚至使應用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

除了來自@ sambi.reddy的回答有一個評論,說 - 「確保你處理這些按鈕時,瀏覽器輸入改變」。這是我必須做的,以使這部分工作。

我用了IStructuredContentProvider的實現,所以在重載把inputChanged(...),我不得不把下面的代碼框架: -

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

這工作得很好,但如果你有刷新表(即viewer.setInput(List))作爲您按鈕操作的結果。當我將這個下面的行有時會返回仍然存在按鈕,但都被設置:

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

所以我需要更新這一行是:

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

這就造成了任何配置按鈕是重新創建,如果仍然需要的話。

相關問題