快速业务通道

[Eclipse]GEF入门系列(八、使用EMF构造GEF的模型) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
听器列表,下面是SubjectPart的实现, 其中eAdapters()得到监听器列表:

public void activate() {    super.activate();    ((Subject)getModel().eAdapters()).add(this); }

可以看到,我们对EditPart所做的修改实际是在两种消息机制之间的转换,如果你对以前 的那套机制很熟悉的话,这里理解起来不应该有任何困难。

ElementFactory的修改

这个类的作用是根据template创建新的模型对象实例,以前的实现都是"new XXX()"这样 ,用了EMF以后应改为"ModelFactory.eINSTANCE.createXXX()",EMF里的每个模型对象实例 都应该是使用工厂创建的。

public Object getNewObject() {    if (template.equals(Diagram.class))      return ModelFactory.eINSTANCE.createDiagram();    else if (template.equals(Subject.class))      return ModelFactory.eINSTANCE.createSubject();    else if (template.equals(Attribute.class))      return ModelFactory.eINSTANCE.createAttribute();    else if (template.equals(Connection.class))      return ModelFactory.eINSTANCE.createConnection();    return null; }

使用自定义CreationFactory代替SimpleFactory

在原先的PaletteFactory里定义CreationEntry时都是指定SimpleFactory作为工厂,这个 类是使用 Class.newInstance()创建新的对象实例,而用EMF作为模型后,创建实例的工作应 该交给ModelFactory来完成,所以必须定义自己的CreationFactory。(注意,示例代码里没 有包含这个修改。)

[Eclipse]GEF入门系列(八、使用EMF构造GEF的模型)(3)

时间:2011-04-19 cnblogs bjzhanghao

处理自定义数据类型

我们的Node类里有两个非标准数据类型:Point和Dimension,要让EMF能够正确的将它们 保存,必须提供序列化和反序列化它们的方法。在EMF为我们生成的代码里,找到 ModelFactoryImpl类,这里有形如convertXXXToString()和 createXXXFromString()的几个 方法,分别用来序列化和反序列化这种外部数据类型。我们要把它的缺省实现改为自己的方 式,下面是我对 Point的实现方式:

public String convertPointToString(EDataType eDataType, Object instanceValue) {    Point p = (Point) instanceValue;    return p.x + "," + p.y; } public Point createPointFromString(EDataType eDataType, String initialValue) {    Point p = new Point();    String[] values = initialValue.split(",");    p.x = Integer.parseInt(values[0]);    p.y = Integer.parseInt(values[1]);    return p; }

注意,修改后要将方法前面的@generated注释删除,这样在重新生成代码时才不会被覆盖 掉。要设置使用这些类型的变量的缺省值会有点问题(例如设置Node类的location属性的缺 省值),在EMF自带的Sample Ecore Model Editor里设置它的defaultValueLiteral 为"100,100"(这是我们通过convertPointToString()方法定义的序列化形式)会报一个错, 但不管它就可以了,在生成的代码里会得到这个缺省值。

保存和载入模型

EMF通过Resource管理模型数据,几个Resource放在一起称为ResourceSet。前面说过,要 想正常保存模型,必须保证每个模型对象都被包含在Resource里,当然间接包含也是可以的 。比如例子这个模型,Diagram是被包含在Resource里的(创建新Diagram 时即被加入),而 Diagram包含Subject,Subject包含Attribute,所以它们都在Resource里。在图1中可以看到 , Diagram和Connection之间存在一对多的包含关系,这个关系的主要作用就是确保在保存 模型时不会出现 Dangling

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号