将删除按钮添加到表中的列

时间:2012-09-18 15:41:15

标签: java button swt jface tableviewer

是否可以将删除按钮添加到表格中的单元格?

我有一个包含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();
         }
      });

3 个答案:

答案 0 :(得分: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())

如果仍然需要重新设置任何处置按钮,那么会导致它们被删除。

答案 1 :(得分:1)

所选答案的一个重要之处在于,您不应在每次更新方法调用时创建TableEditor实例,否则会降低性能甚至使应用程序无法使用。

@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 :(得分: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();