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