在swt viewer栏中加入一个table并可以增加和删除行,第一列为ccombo控件,第二列和第三列为String,完整代码和注释
时间: 2023-11-22 14:52:35 浏览: 45
以下是在 SWT Viewer 中加入一个 Table 并可以增加和删除行,第一列为 CCombo 控件,第二列和第三列为 String 的完整代码和注释。
```java
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
public class TableViewerExample {
private static final String[] COLORS = {"Red", "Green", "Blue"};
private static final String[] HEADERS = {"Color", "Column 2", "Column 3"};
private List<String[]> data = new ArrayList<>();
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
new TableViewerExample().createContents(shell);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
private void createContents(Composite parent) {
// Create a button to add new rows to the table
Button addButton = new Button(parent, SWT.PUSH);
addButton.setText("Add Row");
addButton.addListener(SWT.Selection, event -> {
// Add a new row to the data list
data.add(new String[HEADERS.length]);
// Refresh the table viewer to show the new row
tableViewer.refresh();
});
// Create a button to delete selected rows from the table
Button deleteButton = new Button(parent, SWT.PUSH);
deleteButton.setText("Delete Rows");
deleteButton.addListener(SWT.Selection, event -> {
// Get the selected table items
TableItem[] selection = tableViewer.getTable().getSelection();
// Remove the corresponding data rows
for (TableItem item : selection) {
data.remove(item.getData());
}
// Refresh the table viewer to show the deleted rows
tableViewer.refresh();
});
// Create a table viewer
TableViewer tableViewer = new TableViewer(parent, SWT.BORDER | SWT.FULL_SELECTION);
tableViewer.setContentProvider(ArrayContentProvider.getInstance());
// Create the table columns
for (int i = 0; i < HEADERS.length; i++) {
TableViewerColumn column = new TableViewerColumn(tableViewer, SWT.NONE);
TableColumn tableColumn = column.getColumn();
tableColumn.setText(HEADERS[i]);
tableColumn.setWidth(100);
tableColumn.setResizable(true);
// Set the label provider for the column
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
String[] rowData = (String[]) element;
return rowData[i];
}
});
// Set the editing support for the second and third columns
if (i == 1 || i == 2) {
column.setEditingSupport(new TextEditingSupport(tableViewer, i));
}
// Set the editing support for the first column (using a CCombo)
else if (i == 0) {
column.setEditingSupport(new ComboEditingSupport(tableViewer));
}
}
// Set the input data for the table viewer
tableViewer.setInput(data);
}
private class ComboEditingSupport extends EditingSupport {
private final ComboBoxCellEditor editor;
public ComboEditingSupport(TableViewer viewer) {
super(viewer);
this.editor = new ComboBoxCellEditor(viewer.getTable(), COLORS, SWT.READ_ONLY);
}
@Override
protected CellEditor getCellEditor(Object element) {
return editor;
}
@Override
protected boolean canEdit(Object element) {
return true;
}
@Override
protected Object getValue(Object element) {
String[] rowData = (String[]) element;
String color = rowData[0];
int index = -1;
for (int i = 0; i < COLORS.length; i++) {
if (COLORS[i].equals(color)) {
index = i;
break;
}
}
return index;
}
@Override
protected void setValue(Object element, Object value) {
String[] rowData = (String[]) element;
int index = (int) value;
String color = COLORS[index];
rowData[0] = color;
getViewer().update(element, null);
}
}
private class TextEditingSupport extends EditingSupport {
private final TextCellEditor editor;
private final int columnIndex;
public TextEditingSupport(TableViewer viewer, int columnIndex) {
super(viewer);
this.editor = new TextCellEditor(viewer.getTable());
this.columnIndex = columnIndex;
}
@Override
protected CellEditor getCellEditor(Object element) {
return editor;
}
@Override
protected boolean canEdit(Object element) {
return true;
}
@Override
protected Object getValue(Object element) {
String[] rowData = (String[]) element;
return rowData[columnIndex];
}
@Override
protected void setValue(Object element, Object value) {
String[] rowData = (String[]) element;
rowData[columnIndex] = (String) value;
getViewer().update(element, null);
}
}
}
```
在这个例子中,我们使用 SWT Viewer 创建了一个 Table,并且加入了两个按钮:增加行和删除行。我们还定义了三个表头:第一列为 CCombo 控件,第二列和第三列为 String。在第一列中,我们使用 ComboBoxCellEditor 来实现 CCombo 控件的编辑;在第二列和第三列中,我们使用 TextCellEditor 来实现 String 的编辑。
我们使用了 ArrayContentProvider 来提供表格的数据,因此我们需要在代码中维护一个 List<String[]> 类型的 data 变量来存储数据。在增加行时,我们向 data 变量中添加一个新的空数组,并调用 tableViewer.refresh() 来刷新表格;在删除行时,我们获取所选的 TableItem,从 data 变量中删除相应的数据行,并调用 tableViewer.refresh() 来刷新表格。
我们使用 ColumnLabelProvider 来设置每一列的标签内容。我们为第一列设置了 ComboEditingSupport,使用 ComboBoxCellEditor 来编辑 CCombo 控件。我们为第二列和第三列设置了 TextEditingSupport,使用 TextCellEditor 来编辑 String。在 setValue 方法中,我们更新了 data 变量中的数据,并调用 getViewer().update(element, null) 来刷新表格。