ICellModifier的用法

唉,以为自己知道,其实不知道,这才叫一瓶子不满,半瓶子咣荡!

首先必须明白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,一定要通过这个函数将列属性传进来。

你可能感兴趣的:(Modifier)