经过trace,找到答案了
只需要在ICellModifier实现类的modify(..)方法最后,加上tableViewer.refresh();即可
附上完整代码, 另外实现了点击一列,按该列排序.
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
/**
* @author Jove
*/
public class TextTable {
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell();
shell.setLayout(new GridLayout());
shell.setText("Text Table");
{
final Table table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
table.setLayoutData(new GridData(GridData.FILL_BOTH));
table.setLinesVisible(true);
table.setHeaderVisible(true);
{
final TableColumn tableColumn = new TableColumn(table, SWT.NONE);
tableColumn.setWidth(100);
tableColumn.setText("A");
}
{
final TableColumn tableColumn = new TableColumn(table, SWT.NONE);
tableColumn.setWidth(100);
tableColumn.setText("B");
}
{
final TableColumn tableColumn = new TableColumn(table, SWT.NONE);
tableColumn.setWidth(100);
tableColumn.setText("C");
}
final TableViewer tableViewer = new TableViewer(table);
final String[] columns = { "A", "B", "C" };
class MyData {
public String a, b, c;
public MyData(String a, String b, String c) {
this.a = a;
this.b = b;
this.c = c;
}
}
tableViewer.setColumnProperties(columns);
CellEditor[] cellEditor = new CellEditor[columns.length];
for (int i = 0; i < cellEditor.length; i++) {
cellEditor[i] = new TextCellEditor(table);
}
tableViewer.setCellEditors(cellEditor);
tableViewer.setCellModifier(new ICellModifier() {
public boolean canModify(Object element, String property) {
return true;
}
public Object getValue(Object element, String property) {
MyData data = (MyData) element;
if ("A".equals(property)) {
return data.a;
} else if ("B".equals(property)) {
return data.b;
} else if ("C".equals(property)) {
return data.c;
}
return "";
}
public void modify(Object element, String property, Object value) {
TableItem tableItem = (TableItem) element;
MyData data = (MyData)((TableItem) element).getData();
String newValue = (String) value;
if ("A".equals(property)) {
data.a = newValue;
} else if ("B".equals(property)) {
data.b = newValue;
} else if ("C".equals(property)) {
data.c = newValue;
}
tableViewer.refresh();
}
});
tableViewer.setContentProvider(new IStructuredContentProvider() {
public Object[] getElements(Object inputElement) {
return (MyData[]) inputElement;
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
});
tableViewer.setLabelProvider(new ITableLabelProvider() {
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public String getColumnText(Object element, int columnIndex) {
MyData data = (MyData) element;
switch (columnIndex) {
case 0 :
return data.a;
case 1 :
return data.b;
case 2 :
return data.c;
}
return "";
}
public void addListener(ILabelProviderListener listener) {
}
public void dispose() {
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
}
});
MyData[] data = { new MyData("1", "2", "3"), new MyData("a", "b", "c")};
tableViewer.setInput(data);
class MyDataSorter extends ViewerSorter {
public boolean reversed = false;
public int columnNumber;
static final int COL_A = 0;
static final int COL_B = 1;
static final int COL_C = 2;
private int[][] SORT_ORDERS_BY_COLUMN = { { COL_A, COL_B, COL_C }, {
COL_B, COL_C, COL_A }, {
COL_C, COL_A, COL_B }
};
public int compare(Viewer viewer, Object o1, Object o2) {
MyData data1 = (MyData) o1;
MyData data2 = (MyData) o2;
int result = 0;
if (data1 == null || data2 == null) {
result = super.compare(viewer, o1, o2);
} else {
int[] columnSortOrder = SORT_ORDERS_BY_COLUMN[columnNumber];
for (int i = 0; i < columnSortOrder.length; ++i) {
result = compareColumnValue(columnSortOrder[i], data1, data2);
if (result != 0)
break;
}
}
if (reversed)
result = -result;
return result;
}
int compareColumnValue(int columnNumber, MyData e1, MyData e2) {
switch (columnNumber) {
case 0 : /* a */
return e1.a.compareTo(e2.a);
case 1 : /* b*/
return e1.b.compareTo(e2.b);
case 2 : /* c*/
return e1.c.compareTo(e2.c);
}
return 0;
}
}
MyDataSorter sorter = new MyDataSorter();
sorter.columnNumber = MyDataSorter.COL_A;
tableViewer.setSorter(sorter);
SelectionListener selectionListener = new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
int column = tableViewer.getTable().indexOf((TableColumn) e.widget);
MyDataSorter oldSorter = (MyDataSorter) tableViewer.getSorter();
if (column == oldSorter.columnNumber) {
oldSorter.reversed = !oldSorter.reversed;
tableViewer.refresh();
} else {
oldSorter.columnNumber = column;
tableViewer.refresh();
}
}
};
for (int i = 0; i < columns.length; i++) {
table.getColumn(i).addSelectionListener(selectionListener);
}
}
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
}