是否可以将删除按钮添加到表格中的单元格?
我有一个包含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();
}
});
答案 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();