解决EMF里引用对象的刷新问题
假设在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里引用对象的刷新问题相关推荐
- ES里关于对象的拓展
一.对象类别 在浏览器这样的执行环境中,对象没有统一的标准,在标准中又使用不同的术语描述对象,ES6规范清晰定义了每一个类别的对象,对象的类别如下 1.普通(Ordinary)对象:具有JS对象所有的 ...
- nstimer循环引用_iOS中解决NSTimer循环引用问题
NSTimer使用不当就会造成内存泄漏,比如常见的使用方法: //定义 @property (nonatomic, strong) NSTimer *timer; //实现 self.timer = ...
- addroutes刷新_vue 解决addRoutes动态添加路由后刷新失效问题
前言 某些场景下我们需要利用addRoutes动态添加路由,但是刷新后就会失效,前段时间项目里刚好遇到了这个应用场景,所以就花时间研究了一下,做下分享跟记录,说的不对的地方,请大家指正. 应用场景:用 ...
- 原型模式(ProtoType) - Java里的对象复制
一, 引用的复制和对象复制. 在编程中, 我们有时会用两个引用指向同一个对象. 例如: ArrayList a = new ArrayLIst(); ArrayList b = a; 看起来好像有a, ...
- java file 对象_Java里File对象的问题。
Java里File对象的问题. 关注:282 答案:2 mip版 解决时间 2021-02-02 07:14 提问者鉨瞞着所囿亾,爱着誰 2021-02-01 08:59 import java. ...
- 包含目录、库目录、附加包含目录、附加库目录、附加依赖项如何使用? 及静态库,动态库的创建与调用和vs里引用的使用
引言:vs中怎么添加外部头文件? 如过直接在项目头文件处,添加一下,如下图: 否则,依然会报错,如下图: 有两种方法,来解决(你不在vs上的添加它也没事): (1) 直接把外部头文件复制过来,放在此项 ...
- 已解决pandas创建DataFrame对象失败
已解决(pandas创建DataFrame对象失败)ValueError: Shape of passed values is (1509, 1), indices imply (1509, 2) 文 ...
- 如何实现一个深拷贝(考虑循环引用对象、和symbol类型)
文章目录 第一步:简单实现 第二步:拷贝数组 第三步:循环引用 1.使用哈希表 2.使用数组 第四步:拷贝 Symbol 第一步:简单实现 其实深拷贝可以拆分成 2 步,浅拷贝 + 递归,浅拷贝时判断 ...
- 5分钟解决阿里云oss对象存储
5分钟解决阿里云OSS对象存储 后附关键代码 启动代码如下: pom.xml里添加依赖 com.aliyun.oss aliyun-sdk-oss 2.8.3 1.建类AliyunOSSClientU ...
最新文章
- 回顾我学过的编程语言
- 一文弄懂用户画像以及如何召回用户
- Livy安装使用(Spark rest接口服务工具)
- C#数“.NET研究”据本地存储方案之SQLite
- 机智云产品、功能、服务一览表
- 计算机公共基础课程标准,计算机应用基础》的课程标准.doc
- Python 如何拆分数据集
- Python字符串处理的8招秘籍
- Kafka 麒麟先生_近百位超人气嘉宾出席元旦萤火虫,重磅新企划蓄势待发!
- CE的EMC测试(EN55022-EN55024-EN55014)-转载
- Oracle 数据库基本知识概念
- 【算法基础三】算法如何入门?零基础入门算法应该学些什么?
- 蓝箭航天自主研发80吨液氧甲烷发动机喷管下线
- 样本T检验、方差分析(ANOVA)、wilcoxon秩和检验、KW秩和检验详解和操作步骤
- 怎么把计算机管理的磁盘找出来,电脑分区显示不出来怎么办
- 数字电视标准5种规格720p、1080i和…
- c#用canny算子做边缘提取_matlab-如何进行边缘检测/边缘提取(对弹孔进行边缘检测)
- WSDM 2017精选论文
- 设计模式学习笔记(一)
- 上线不到两个月,昇腾AI助推“中国算力网”再添新节点