treeView refresh

当我们使用TableViewer或TreeViewer时,每当其input值发生改变,通常要调用视图的refresh方法来执行刷新操作,而使用EMF模型作为视图组件的文本提供器和标签提供器,却可以省略refresh操作。

当构建AdapterFactoryContentProvider和AdapterFactoryLabelProvider对象时,需要传入所需要的适配器工厂类,该适配器工厂类实现了IChangeNotifier接口定义的3个方法,起到了监听器的作用:
addListener(INotifyChangedListener notifyChangedListener):添加监听者
removeListener(INotifyChangedListener notifyChangedListener):删除监听者
fireNotifyChanged(Notification notification):对监听者执行通知操作

而同时AdapterFactoryContentProvider和AdapterFactoryLabelProvider对象都实现了INotifyChangedListener接口,因此在构造方法中,便可将自己注册成为适配器工厂类的监听者:

view plaincopy to clipboardprint?
01.public AdapterFactoryContentProvider(AdapterFactory adapterFactory){
02. this.adapterFactory = adapterFactory;
03. if (adapterFactory instanceof IChangeNotifier){
04. ((IChangeNotifier)adapterFactory).addListener(this);//将自己注册成为adapterFactory的监听者
05. }
06.}
public AdapterFactoryContentProvider(AdapterFactory adapterFactory){
this.adapterFactory = adapterFactory;
if (adapterFactory instanceof IChangeNotifier){
((IChangeNotifier)adapterFactory).addListener(this);//将自己注册成为adapterFactory的监听者
}
}
这样,当适配器工厂类执行fireNotifyChanged方法时,便可将模型改变通知到AdapterFactoryContentProvider和AdapterFactoryLabelProvider对象,执行它们的notifyChanged()方法:

view plaincopy to clipboardprint?
01.public void notifyChanged(Notification notification){
02. if (viewer != null && viewer.getControl() != null && !viewer.getControl().isDisposed()){
03. if (notification instanceof IViewerNotification){
04. if (viewerRefresh == null){
05. viewerRefresh = new ViewerRefresh(viewer);
06. }
07. if (viewerRefresh.addNotification((IViewerNotification)notification)){
08. viewer.getControl().getDisplay().asyncExec(viewerRefresh);
09. }
10. }
11. else{
12. NotifyChangedToViewerRefresh.handleNotifyChanged(viewer,notification.getNotifier(),notification.getEventType(),
13. notification.getFeatur(),notification.getOldValue(),notification.getNewValue(),notification.getPosition());
14. }
15. }
16.}
public void notifyChanged(Notification notification){
if (viewer != null && viewer.getControl() != null && !viewer.getControl().isDisposed()){
if (notification instanceof IViewerNotification){
if (viewerRefresh == null){
viewerRefresh = new ViewerRefresh(viewer);
}
if (viewerRefresh.addNotification((IViewerNotification)notification)){
viewer.getControl().getDisplay().asyncExec(viewerRefresh);
}
}
else{
NotifyChangedToViewerRefresh.handleNotifyChanged(viewer,notification.getNotifier(),notification.getEventType(),
notification.getFeatur(),notification.getOldValue(),notification.getNewValue(),notification.getPosition());
}
}
}


由代码可以看出AdapterFactoryContentProvider和AdapterFactoryLabelProvider对象还记录了它们所对应的视图viewer,并在notifyChanged方法中对视图执行了刷新操作。

然而回到上一步,适配器工厂类的fireNotifyChanged方法又是在什么时候触发的呢?

当EMF实体类的类结构发生变化时(如:对某一个属性执行了set方法),会调用eNotify(Notification notification)方法来触发其适配器类的通知操作:

view plaincopy to clipboardprint?
01.public void eNotify(Notification notification){
02. Adapter[] eAdapters = eBasicAdapterArray();//返回该实体类所有的适配器类
03. if (eAdapters != null && eDeliver()){
04. for (int i = 0, size = eAdapters.length; i < size; ++i)
05. {
06. eAdapters[i].notifyChanged(notification);//执行适配器类的notifyChanged方法。
07. }
08. }
09.}
public void eNotify(Notification notification){
Adapter[] eAdapters = eBasicAdapterArray();//返回该实体类所有的适配器类
if (eAdapters != null && eDeliver()){
for (int i = 0, size = eAdapters.length; i < size; ++i)
{
eAdapters[i].notifyChanged(notification);//执行适配器类的notifyChanged方法。
}
}
}


而EMF模型适配器类的构造函数中同样传入了adapterFactory适配器工厂类,这样在模型适配器类的notifyChanged方法中,便可进行如下处理:

view plaincopy to clipboardprint?
01.if (adapterFactory instanceof IChangeNotifier){
02. IChangeNotifier changeNotifier = (IChangeNotifier)adapterFactory;
03. changeNotifier.fireNotifyChanged(notification);
04.}
if (adapterFactory instanceof IChangeNotifier){
IChangeNotifier changeNotifier = (IChangeNotifier)adapterFactory;
changeNotifier.fireNotifyChanged(notification);
}


以此来触发适配器工厂类的fireNotifyChanged方法。
整个模型改变通知的类图大致如下:


1、当模型实体类Company的类结构发生变化时,会触发其适配器类(CompanyItemProvider)的notifyChange()方法;
2、模型适配器类会调用其适配器工厂类的fireNotifyChanged方法,来触发监听器的通知;
3、适配器工厂类对它的监听者(AdapterFactoryContentProvider)进行通知,执行他们的notifyChanged方法;
4、AdapterFactoryContentProvider对象中会执行视图的刷新操作。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/JavaMan_chen/archive/2010/11/30/6045954.aspx


http://www.java2s.com/CN/Code/Java/SWT-JFace-Eclipse/Demonstratesmultilinecomments.htm


http://www.ibm.com/developerworks/cn/java/wa-eclipsemvc/


MVC 架构(或设计模式)是图形用户界面(GUI)的设计样式,由三部分构成:模型、视图和控制器。MVC 把表示层从数据解耦出来,也把表示从数据的操作解耦出来。
实现 MVC 架构与其他类型的应用程序有所不同。主要的区别来自如何放置和实现业务逻辑或查看呈现逻辑。与典型的 Web 应用程序不同,在这类程序中,程序员必须设计和实现所有 MVC 组件,而 Eclipse 提供的 API 可以替您做大部分控制或呈现工作。所以,不能严格地把 Eclipse 的 MVC 实现与 Web 或其他应用程序类型的 MVC 进行比较。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值