唉,以为自己知道,其实不知道,这才叫一瓶子不满,半瓶子咣荡!
首先必须明白ICellModifier接口必须与某一个CellEditor结合在一起使用,它表示的含义是通过Cell Editor来访问数据模型。
ICellModifier是“顶层”接口,如果想为TableViewer提供Cell Modifier,那么必须继承这一个接口。
这一接口提供了三个函数:
1、public boolean canModify(Object element, String property);
这一函数检查给定的element中的某一个property是否能够被“修改”,其中element是数据模型的data element,而property是这个数据模型中的某一个字段名;也就是说,element是一个Java Bean类型,property是这个Java Bean的某一个字段的名字;
2、public Object getValue(Object element, String property);
这一函数中的参数含义与第一个函数的参数含义是一致的,都表示数据模型。但是这一函数的功能是获得给定数据模型的某一个属性的值;
3、public void modify(Object element, String property, Object value);
这个函数需要注意:参数element可能是SWT Item而不是数据模型的data element,也就是说这里的element可能是TableItem,而不是Java Bean所对应的那个data element,因此为了安全起见,需要如下判断:
if (element instanceof Item) {
element = ((Item) element).getData();
}
// modify the element's property here
参数value是对应property的新值。这个函数的功能是将模型的值改变为给定的那个新值;
给个例子如下:
private final static String[] COLUMN_HEADINGS = { "Property", "Value" };
class TableCellModifier implements ICellModifier {
public boolean canModify(Object element, String property) {
return true;
}
public Object getValue(Object element, String property) {
Object result = null;
Row row = (Row) element;
List list = Arrays.asList(COLUMN_HEADINGS);
int columnIndex = list.indexOf(property);
switch (columnIndex) {
case 0:
result = row.getKey(); break;
case 1:
result = row.getValue(); break;
}
return result;
}
public void modify(Object element, String property, Object value) {
List list = Arrays.asList(COLUMN_HEADINGS);
int columnIndex = list.indexOf(property);
TableItem tableItem = (TableItem) element;
Row row = (Row) tableItem.getData();
switch (columnIndex) {
case 0:
String key = (String) value;
if (key.length() > 0) {
row.setKey(key);
}
break;
case 1:
String v = (String) value;
if (v.length() > 0) {
row.setValue(v);
}
break;
}
tableViewer.update(row, null);
}
}
private class Row {
private String key;
private String value;
public Row(String key, String value) {
setKey(key);
setValue(value);
}
public void setKey(String key) {
this.key = key;
}
public String getKey() {
return key;
}
public void setValue(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
刚才在写CellEditor时,发现了这个函数:public void setColumnProperties(String[] columnProperties);这里必须要注意:这个函数是用来设定table viewer的列属性的,属性值必须与table的列相对应,它们被用来在cell modifier中标识列;这个函数很重要!在定义TableViewer时,如果要用ICellModifier,一定要通过这个函数将列属性传进来。