假设在ecore模型里定义了两个类:产品(Product)和制造商(Manufacturer),Product通过名为manufacturer的多对一引用与Manufacturer建立关系。在应用程序里,有一些表格(TableViewer)需要在显示产品信息的同时,还要显示制造商相关信息,如制造商名称。缺省条件下,因为这些表格里每一行是一个Product实例,表格的文字更新由AdapterFactoryLabelProvider通过ProductItemProvider实现,所以在制造商名称被改变的时候产品表格无法得到更新。

当然可以直接调用viewer.refresh()方法刷新表格,但这要求具有对viewer的引用,况且我们不知道以后还会有多少个这样的viewer需要刷新。更好的解决办法是修改ProductItemProvider,让它维护一个Adapter(即EMF里的模型监听器),并把这个监听器注册到Product对应的Manufacturer实例上。监听器的注册可以在getText()方法里实现(也许有更合适的地方),别忘了在dispose()方法里要删除这个监听器。此外,要在.genmodel里把Product的Provider Type属性值从缺省的"Singleton"改为"Stateful",如下图,这样每个Product都对应一个ProductItemProvider实例,从而对应一个这样的监听器。

以下是ProductItemProvider里部分相关代码:

//Define an adapterprotected Adapter manufacturerAdapter =new AdapterImpl(){public void notifyChanged(Notification notification){//notify product viewers if manufacturer's name changedif (notification.getFeatureID(Manufacturer.class) == ProductPackage.MANUFACTURER__NAME)fireNotifyChanged(new ViewerNotification(notification, ProductItemProvider.this.getTarget(), false, true));}};public String getText(Object object) {Product product = (Product) object;//Add following codes to maintain the adapterManufacturer manufacturer = product.getManufacturer();if (manufacturer != manufacturerAdapter.getTarget()) {if (manufacturerAdapter.getTarget() != null)manufacturerAdapter.getTarget().eAdapters().remove(manufacturerAdapter);if (manufacturer != null)manufacturer.eAdapters().add(manufacturerAdapter);}String label = var.getName();return label;}//Remove adapter when ProductItemProvider disposespublic void dispose() {if (manufacturerAdapter.getTarget() != null)manufacturerAdapter.getTarget().eAdapters().remove(manufacturerAdapter);super.dispose();} 

最后,需要覆盖ProductItemProvider的notifyChanged()方法,在switch里增加如下代码:

case ProductPackage.Product__Manufacturer:fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));return;

本文转自博客园八进制的博客,原文链接:解决EMF里引用对象的刷新问题,如需转载请自行联系原博主。

解决EMF里引用对象的刷新问题相关推荐

  1. ES里关于对象的拓展

    一.对象类别 在浏览器这样的执行环境中,对象没有统一的标准,在标准中又使用不同的术语描述对象,ES6规范清晰定义了每一个类别的对象,对象的类别如下 1.普通(Ordinary)对象:具有JS对象所有的 ...

  2. nstimer循环引用_iOS中解决NSTimer循环引用问题

    NSTimer使用不当就会造成内存泄漏,比如常见的使用方法: //定义 @property (nonatomic, strong) NSTimer *timer; //实现 self.timer = ...

  3. addroutes刷新_vue 解决addRoutes动态添加路由后刷新失效问题

    前言 某些场景下我们需要利用addRoutes动态添加路由,但是刷新后就会失效,前段时间项目里刚好遇到了这个应用场景,所以就花时间研究了一下,做下分享跟记录,说的不对的地方,请大家指正. 应用场景:用 ...

  4. 原型模式(ProtoType) - Java里的对象复制

    一, 引用的复制和对象复制. 在编程中, 我们有时会用两个引用指向同一个对象. 例如: ArrayList a = new ArrayLIst(); ArrayList b = a; 看起来好像有a, ...

  5. java file 对象_Java里File对象的问题。

    Java里File对象的问题. 关注:282  答案:2  mip版 解决时间 2021-02-02 07:14 提问者鉨瞞着所囿亾,爱着誰 2021-02-01 08:59 import java. ...

  6. 包含目录、库目录、附加包含目录、附加库目录、附加依赖项如何使用? 及静态库,动态库的创建与调用和vs里引用的使用

    引言:vs中怎么添加外部头文件? 如过直接在项目头文件处,添加一下,如下图: 否则,依然会报错,如下图: 有两种方法,来解决(你不在vs上的添加它也没事): (1) 直接把外部头文件复制过来,放在此项 ...

  7. 已解决pandas创建DataFrame对象失败

    已解决(pandas创建DataFrame对象失败)ValueError: Shape of passed values is (1509, 1), indices imply (1509, 2) 文 ...

  8. 如何实现一个深拷贝(考虑循环引用对象、和symbol类型)

    文章目录 第一步:简单实现 第二步:拷贝数组 第三步:循环引用 1.使用哈希表 2.使用数组 第四步:拷贝 Symbol 第一步:简单实现 其实深拷贝可以拆分成 2 步,浅拷贝 + 递归,浅拷贝时判断 ...

  9. 5分钟解决阿里云oss对象存储

    5分钟解决阿里云OSS对象存储 后附关键代码 启动代码如下: pom.xml里添加依赖 com.aliyun.oss aliyun-sdk-oss 2.8.3 1.建类AliyunOSSClientU ...

最新文章

  1. 回顾我学过的编程语言
  2. 一文弄懂用户画像以及如何召回用户
  3. Livy安装使用(Spark rest接口服务工具)
  4. C#数“.NET研究”据本地存储方案之SQLite
  5. 机智云产品、功能、服务一览表
  6. 计算机公共基础课程标准,计算机应用基础》的课程标准.doc
  7. Python 如何拆分数据集
  8. Python字符串处理的8招秘籍
  9. Kafka 麒麟先生_近百位超人气嘉宾出席元旦萤火虫,重磅新企划蓄势待发!
  10. CE的EMC测试(EN55022-EN55024-EN55014)-转载
  11. Oracle 数据库基本知识概念
  12. 【算法基础三】算法如何入门?零基础入门算法应该学些什么?
  13. 蓝箭航天自主研发80吨液氧甲烷发动机喷管下线
  14. 样本T检验、方差分析(ANOVA)、wilcoxon秩和检验、KW秩和检验详解和操作步骤
  15. 怎么把计算机管理的磁盘找出来,电脑分区显示不出来怎么办
  16. 数字电视标准5种规格720p、1080i和…
  17. c#用canny算子做边缘提取_matlab-如何进行边缘检测/边缘提取(对弹孔进行边缘检测)
  18. WSDM 2017精选论文
  19. 设计模式学习笔记(一)
  20. 上线不到两个月,昇腾AI助推“中国算力网”再添新节点

热门文章

  1. 原生JavaScript练习——全选
  2. jQuery 的禁用和只读 ---防暴动处理
  3. ASP.NET页面刷新的实现方法
  4. windows curl ssl版本编译
  5. Ui学习笔记---EasyUI的使用方法,EasyLoader组件使用
  6. sqlite排序规则
  7. Java中String连接性能的分析
  8. sqlserver数据库备份
  9. 建立一个普通方法无法打开查看和删除的文件夹
  10. html里定义函数调用函数调用,函数调用的三种方式是什么?