Java 向表中的列添加“删除”按钮

Java 向表中的列添加“删除”按钮,java,button,swt,jface,tableviewer,Java,Button,Swt,Jface,Tableviewer,是否可以将“删除”按钮添加到表中的单元格 我有一个5列的表,我想添加第6列。我希望第6列的每一行都有一个删除按钮 示例行: |10002 |零件|金属| 001 |是|移除| 这样,用户只需单击按钮即可删除任何不需要的行 我在表中有一个标记列,它是ComboBox。我创建了一个扩展编辑支持的类 我是否需要创建另一个类来扩展编辑支持,但创建一个按钮而不是组合框 编辑 public class AplotDataTableViewer extends TableViewer { publi

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

我有一个5列的表,我想添加第6列。我希望第6列的每一行都有一个删除按钮

示例行:

|10002 |零件|金属| 001 |是|移除|

这样,用户只需单击按钮即可删除任何不需要的行

我在表中有一个标记列,它是
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();
         }
      });
编辑

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

下面的代码应该适合您

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

这里是示例工作版本

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

    }


}
公共类TableEditorTest{
/**
*@param args
*/
公共静态void main(字符串[]args){
显示=新显示();
外壳=新外壳(显示);
setLayout(新的FillLayout());
TableViewer=新的TableViewer(外壳);
viewer.getTable().setheadervible(true);
viewer.getTable().setLinesVisible(true);
setContentProvider(新的ArrayContentProvider());
TableColumn=newtableColumn(viewer.getTable(),SWT.NONE);
setText列(“名字”);
列。设置宽度(100);
TableViewerColumn firstNameCol=新的TableViewerColumn(查看器,列);
setLabelProvider(新的ColumnLabelProvider(){
@凌驾
公共字符串getText(对象元素){
Person p=(Person)元素;
返回p.getFirstName();
}
});
column=newtableColumn(viewer.getTable(),SWT.NONE);
setText列(“姓氏”);
列。设置宽度(100);
TableViewerColumn lastNameCol=新的TableViewerColumn(查看器,列);
lastNameCol.setLabelProvider(新ColumnLabelProvider(){
@凌驾
公共字符串getText(对象元素){
Person p=(Person)元素;
返回p.getLastName();
}
});
column=newtableColumn(viewer.getTable(),SWT.NONE);
setText列(“操作”);
列。设置宽度(100);
TableViewerColumn操作SNAMECOL=新的TableViewerColumn(查看器,列);
actionsNameCol.setLabelProvider(新的ColumnLabelProvider(){
//确保在查看器输入更改时处理这些按钮
映射按钮=新建HashMap();
@凌驾
公共无效更新(ViewerCell单元格){
TableItem=(TableItem)cell.getItem();
按钮;
if(buttons.containsKey(cell.getElement()))
{
button=buttons.get(cell.getElement());
}
其他的
{
button=新按钮((复合)单元格.getViewErrorw().getControl(),SWT.NONE);
按钮.setText(“删除”);
buttons.put(cell.getElement(),button);
}
TableEditor=newTableEditor(item.getParent());
editor.grabHorizontal=true;
editor.grabVertical=true;
setEditor(按钮、项、单元格.getColumnIndex());
编辑器。布局();
}
});
人员p1=新人员();
p1.setFirstName(“乔治”);
p1.setLastName(“Burne”);
人员p2=新人员();
p2.setFirstName(“亚当”);
p2.setLastName(“Silva”);
人员p3=新人员();
p3.setFirstName(“内森”);
p3.setLastName(“整流罩”);
List persons=new ArrayList();
新增(p1);
新增(p2);
新增(p3);
viewer.setInput(个人);
shell.open();
而(!shell.isDisposed())
{
如果(!display.readAndDispatch())
{
display.sleep();
}
}
display.dispose();
}
私人静态类人
{
字符串名;
字符串lastName;
人()
{
}
公共字符串getFirstName(){
返回名字;
}
公共字符串getLastName(){
返回姓氏;
}
public void setFirstName(字符串firstName){
this.firstName=firstName;
}
public void setLastName(字符串lastName){
this.lastName=lastName;
}
}
}

对于所选择的答案,一个重要的问题是,您不应该在每次更新方法调用时创建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();
            }
        }

除了@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())

这会导致重新创建任何按钮(如果仍然需要的话)。

在哪里添加该代码?这是否包含在TableViewer类代码中?我将在上面添加我的tableviewer类代码。请告诉我如何添加它。请覆盖要显示此按钮的tableviewercolumn的ColumnLabelProvider.update(ViewerCell单元格)。从ViewerCell可以获得getItem、getColumnIndex。确保跟踪为每行对象创建的按钮