//此方法写的page页面. //声明TableViewer TableViewer tableViewer_1 = new TableViewer(composite_1, SWT.BORDER | SWT.FULL_SELECTION); table_1 = tableViewer_1.getTable(); FormData fd_table_1 = new FormData(); fd_table_1.top = new FormAttachment(0, 5); fd_table_1.left = new FormAttachment(0, 5); fd_table_1.right = new FormAttachment(100, -5); fd_table_1.bottom = new FormAttachment(100, -5); table_1.setLayoutData(fd_table_1); //创建假数据. for (int i = 0; i < 3; i++) { StudioUserlist user = new StudioUserlist(); user.setUsername("小天" + i); user.setSex("男" + i); user.setStu("true"); userList.add(user); } //声明列对象. TableViewerColumn tableViewerColumn_2 = new TableViewerColumn(tableViewer_1, SWT.NONE); TableColumn tableColumn_2 = tableViewerColumn_2.getColumn(); tableColumn_2.setWidth(100); tableColumn_2.setText("姓名"); //绑定数据. 设置数据索引位置. 必须重0开始. tableViewerColumn_2.setEditingSupport(new TableViewerEditingSupport(tableViewer_1, 0, userList)); tableViewer_1.setLabelProvider(new TableColumnProvider()); //设置如何获取模型中的数据, 每一个都要设置. tableViewer_1.setContentProvider(new TableColumnContentProvider()); tableViewer_1.setInput(userList); //创建列. TableViewerColumn tableViewerColumn_3 = new TableViewerColumn(tableViewer_1, SWT.NONE); TableColumn tableColumn_3 = tableViewerColumn_3.getColumn(); tableColumn_3.setWidth(100); tableColumn_3.setText("性别"); tableViewerColumn_3.setEditingSupport(new TableViewerEditingSupport(tableViewer_1, 1, userList)); tableViewer_1.setLabelProvider(new TableColumnProvider()); //设置如何获取模型中的数据 tableViewer_1.setContentProvider(new TableColumnContentProvider()); tableViewer_1.setInput(userList); //创建列. TableViewerColumn tableViewerColumn_4 = new TableViewerColumn(tableViewer_1, SWT.NONE); TableColumn tableColumn_4 = tableViewerColumn_4.getColumn(); tableColumn_4.setWidth(100); tableColumn_4.setText("是否学生"); tableViewerColumn_4.setEditingSupport(new TableViewerEditingSupport(tableViewer_1, 2, userList)); tableViewer_1.setLabelProvider(new TableColumnProvider()); tableViewer_1.setContentProvider(new TableColumnContentProvider()); tableViewer_1.setInput(userList); /** * 定义表格编辑器(内部类) * */ class TableViewerEditingSupport extends EditingSupport { int column; private TableViewer columnViewer; private CellEditor editor; private List<StudioUserlist> dbColumnList; public TableViewerEditingSupport(ColumnViewer viewers, int column,final List<StudioUserlist> dbColumnList) { super(viewers); this.dbColumnList = dbColumnList; this.columnViewer = (TableViewer) viewers; //此处是创建控件的. switch (column) { case 0: editor = new TextCellEditor(columnViewer.getTable(), SWT.BORDER); break; case 1: editor = new TextCellEditor(columnViewer.getTable(), SWT.BORDER); break; case 2: editor = new ComboBoxCellEditor(columnViewer.getTable(), new String[] { "是", "否" }, SWT.READ_ONLY | SWT.SINGLE | SWT.BORDER); break; } this.column = column; } @Override protected boolean canEdit(Object element) { return true; } @Override protected CellEditor getCellEditor(Object element) { return editor; } @Override protected Object getValue(Object element) { StudioUserlist dbColumn = (StudioUserlist) element; //此处是点击控件时. switch (column) { case 0: return dbColumn.getUsername(); case 1: return dbColumn.getSex(); case 2: return "true".equals(dbColumn.getStu()) ? 0 : 1; } return null; } @Override protected void setValue(Object element, Object value) { StudioUserlist dbColumn = (StudioUserlist) element; switch (column) { case 0: dbColumn.setUsername(value.toString()); break; case 1: dbColumn.setSex(value.toString()); break; case 2: dbColumn.setStu(value.equals(0) ? "true" : "false"); break; } columnViewer.refresh(true); } } /** * 表格列的显示(内部类) * */ class TableColumnProvider extends LabelProvider implements ITableLabelProvider { /** * 返回前面的图片 */ public Image getColumnImage(Object element, int columnIndex) { Image iconImage = null; iconImage = super.getImage(element); return iconImage; } /** * 返回用于显示数据的字符串 */ public String getColumnText(Object element, int columnIndex) { String returnValue = ""; StudioUserlist column = (StudioUserlist) element; //此处是现table里面的. 也就是你把值设置完成后的显示.最终的显示结果 switch (columnIndex) { case 0: returnValue = column.getUsername(); break; case 1: returnValue = column.getSex(); break; case 2: returnValue = "true".equals(column.getStu()) ? "是" : "否"; break; } return returnValue; } } /** * 用于显示列内容(内部类) */ class TableColumnContentProvider implements IStructuredContentProvider { public Object[] getElements(Object inputElement) { if (inputElement instanceof Collection<?>) { // 筛选出没有删除的列 List<StudioUserlist> nonDelCols = new LinkedList(); for (StudioUserlist user : (List<StudioUserlist>) inputElement) { nonDelCols.add(user); } return nonDelCols.toArray(new Object[0]); } return null; } public void dispose() { } @Override public void inputChanged(org.eclipse.jface.viewers.Viewer viewer, Object oldInput, Object newInput) { } }
最终结果: 可修改表格里的数值.
上面的方法比较复杂, 很好的解释了MVC, 对于TableViewer来说如果只是实现很简单得功能, 完全不需要怎么复杂的代码, 纯属为了简便:
tableViewer = new TableViewer(this, SWT.BORDER | SWT.FULL_SELECTION); table = tableViewer.getTable(); managedForm.getToolkit().paintBordersFor(table); table.setHeaderVisible(true); table.setLinesVisible(true); TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.CENTER); TableColumn tableColumn = tableViewerColumn.getColumn(); tableColumn.setWidth(width); tableColumn.setText("姓名"); TableViewerColumn tableViewerColumn_1 = new TableViewerColumn(tableViewer, SWT.NONE); TableColumn tableColumn_1 = tableViewerColumn_1.getColumn(); tableColumn_1.setWidth(width); tableColumn_1.setText("性别"); TableItem table_item; TableEditor editor; table_item = new TableItem(table, SWT.NONE); table_item.setText(0, "小天__"); editor = new TableEditor(table); editor.minimumWidth = width; editor.horizontalAlignment = SWT.LEFT; editor.setEditor(composite, table_item, 1); //composite可以是自己定义的一个组件.
但是如果这样写, 你会面临两个问题:
1. 你想清除一组数据, 在插入一组数据的时候你调用table.clearAll()方法的时候你清除不掉Editor控件,
这里给出的解决方案是把Editor存起来, tableEditorList.add(editor); 就像这样, 用一个List把它存放起来.方便以后清除.
2. 清除掉了Editor之后. 你再次重新插入数据的时候. 你会发现数据不是在你想像中的第一行, 它还是接着上一次删除的那一行开始插入. 导致前面出现了很多空行.
最后发现是因为tbale里面有一个items属性, 里面还有以前的数据没有清除, 所以还必须清楚Items里面的数据才行.
清除数据代码:
//清除Editor. for (int i = 0; i < tableEditorList.size(); i++) { TableEditor tempEditor = tableEditorList.get(i); tempEditor.getEditor().dispose(); tempEditor.dispose(); } tableEditorList.clear(); //清楚存放的List. tableViewer.getTable().clearAll(); //清除表格上所有文字. //清楚表格的元素. TableItem[] itemArray = table.getItems(); for (int i = 0; i < itemArray.length; i++) { itemArray[i].dispose(); }