創建一個SWT的Table,可以通過自己控制Table、TableColumn以及TableItem來實現
這里不詳述,更好的方式則是使用jface的TableViewer來實現MVC表格。
首先我們要准備Model,如:

public class BTDColumn { public final static String KEY_NAME = "Name"; public final static String KEY_DESC = "Desc"; public final static String KEY_TYPE = "Type"; public final static String KEY_NULLABLE = "Nullable"; public final static String KEY_DEFAULTVALUE = "DefaultValue"; public final static String KEY_UUID = "UUID"; public final static String[] KEYS = new String[] { KEY_NAME, KEY_UUID, KEY_TYPE, KEY_DESC, KEY_NULLABLE, KEY_DEFAULTVALUE }; private Map<String, Object> map = new HashMap<String, Object>(); public void setValue(String key, Object value) { map.put(key, value); } public Object getValue(String key) { return map.get(key); } public void dispose() { map.clear(); } }
新建一個TableViewer,為它設置列名和列寬,如下:
TableViewerColumn valueColumn = new TableViewerColumn(TableViewer, SWT.CENTER); valueColumn.getColumn().setText(name); valueColumn.getColumn().setWidth(size);
然后為我們的TableViewer提供LabelProvider,ContentProvider和Sorter。
TableViewer在設置input之后,首先調用的是ContentProvider的getElements方法,來獲取model列表。
所以我們需要重寫該方法以提供model列表。
接着,重寫LabelProvider#getColumnText(Object element, int columnIndex)方法來對列表里的每一個model分別解析,以把數據應用到每一列。
至於Sorter則是決定了排序規則。
這些做完之后,我們再來為這個表格提供單元格編輯器。
在絕大多數的情況下,同一列的單元格編輯器都是相同的。
所以可以想見,單元格編輯器是和TableViewerColumn相關的,代碼如下:
EditingSupport support = new ColumnEditingSupport( valueColumn.getViewer(), type); valueColumn.setEditingSupport(support);
這樣我們就為valueColumn.getViewer()這一列提供了一個ColumnEditingSupport編輯支持。
在這個ColumnEditingSupport里我們再定義具體的單元格編輯器
ColumnEditingSupport#getCellEditor(Object element),本方法在點擊單元格的時候觸發,element是所點擊的單元格所屬行的model。
其返回值必須是org.eclipse.jface.viewers.CellEditor的子類
ColumnEditingSupport#canEdit(Object element) ,本方法決定單擊單元格事件發生后是否彈出編輯器
ColumnEditingSupport#getValue(Object element),該方法決定了單元格編輯器在初始化的時候,獲得的值,在大部分的情況下,它的值是要和當前單元格展示的字符串一致的。
ColumnEditingSupport#setValue(Object element, Object value),該方法是用於單元格編輯器在失去焦點后,將設置后的值返回給單元格。