我的RCP之旅(三) -- MVC
RCP中的view基本上是由JFace的组件提供的.
Eclipse JFace 用ContentProvider和LabelProvider实现 MVC 架构.
RCP通过实例化viewer来实现MVC 的视图部分.而ContentProvider就是模型部分的.
看ContentProvider是要继承IStructuredContentProvider,其源码:
public Object[] getElements(Object inputElement);
可以看到输入的是object,所以其模型是和view无关的领域模型.
那要将这个模型展示在view上还需要通过LabelProvider来转换成适当的形式. 如下:
class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {
public String getColumnText(Object obj, int index) {
return getText(obj);
}
public Image getColumnImage(Object obj, int index) {
return getImage(obj);
}
public Image getImage(Object obj) {
return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
}
}
就是在getColumnText中进行转换的,将Object中的需要显示的东西retrun出来.
在 public void createPartControl(Composite parent)中
viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); 1)
viewer.setContentProvider(new ViewContentProvider()); 2)
viewer.setLabelProvider(new ViewLabelProvider()); 3)
viewer.setInput(new String(){"One","Two","Three"}); 4)
如上代码 1)实例化了一个viewer 2)注入一个 ContentProvider 3)注入一个LabelProvider 4)将数据模型传入view
然后可以通过viewer.refresh();来刷新视图.
可以看出JFace的做法在尽量强制你必须构建独立于GUI的模型.