快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门24小时娱乐在线:EclipseGEF入门系列(八、使用EMF构造GEF的模型)



本文示例源代码或素材下载

GEF的设计没有对澳门24小时娱乐在线模型部分做任何限定,也便是说,我们可以随意率性构造自己的模型,独一须要包管的便是模型具有某种消息机制,以便在发生变更时能够看护GEF(经由过程EditPart)。在曩昔的几个例子里,我们都是使用java.beans包中的PropertyChangeSupport和 PropertyChangeListener来实现消息机制的,这里将先容一下若何让GEF使用EMF构造的模型.

EMF应用自己定义的Ecore作为元模型,在这个元模型里定义了EPackage、EClassifier、EFeature等等观点,我们要定义的模型都是应用这些观点来定义的。同时由于ecore中的所有观点都可以用本身的观点轮回定义,以是ecore又是自己的元模型,也便是元元模型。关于 ecore的具体观点,请参考EMF网站上的有关资料。

使用EMF为我们天生模型代码可以有多种要领,例如经由过程XML Schema、带有注释的Java接口、Rose的mdl文件以及.ecore文件等,EMF的代码天生器必要一个扩展名为.genmodel的文件供给信息,这个文件可以经由过程上面说的几种要领天生,我保举应用Omondo公司的EclipseUML插件来构造.ecore文件,该插件的免费版本可以从这里下载。(大概必要应用国外代理才能造访omondo网站)

图1 示例模型

为了节约篇幅和光阴,我就不具体描述构造EMF项目的步骤了,这里主要把应用EMF与非EMF模型的差别做一个阐明。图1是例子中应用的模型,此中Dimension和Point是两个外部java类型,因为EMF并不懂得它们,以是定义为datatype类型。

应用两个Plugins

为了澳门24小时娱乐在线让模型与编辑器更好的分离,可以让EMF模型零丁位于一个Plugin中(名为SubjectModel),而让编辑器Plugin (SubjectEditor)依附于它。这样做的另一个好处是,当改动模型后,假如你乐意,可以很轻易的删除曩昔天生的代码,然后整个从新天生。

EditPart中的改动

在曩昔我们的EditPart是实现java.beans.PropertyChangeListener接口的,当模型改用EMF实现后, EditPart应澳门24小时娱乐在线改为实现org.eclipse.emf.common.notify.Adapter接口,由于EMF的每个模型工具都是 Notifier,它掩护了一个Adapter列表,可以把Adapter作为 监听 器加入到模型的这个列表中。

实现Adapter接口时须要实现getTarget()和setTarget()措施,target代表发出消息的那个模型工具。我的实现要领是在EditPart里掩护一个Notifier类型的target变量,这两个措施分手返回和设置该变量即可。

还要实现isAdapterForType()措施,该措施返回一个布尔值,表示这个Adapter是否应相应指定类型的消息,我的实现一律为"return type.equals(getModel().getClass());"。

别的,propertyChanged()措施的名称应改为notifyChanged()措施,着实现的功能和曩昔是一样的,但代码有所不合,下面是NodePart中的实现,看一下就应该明白了:

public void notifyChanged(Notification notification) {

int featureId = notification.getFeatureID(ModelPackage.class);

switch (featureId) {

case ModelPackage.NODE__LOCATION:

case ModelPackage.NODE__SIZE:

refreshVisuals();

break;

case ModelPackage.NODE__INCOMING_CONNECTIONS:

refres澳门24小时娱乐在线hTargetConnections();

break;

case ModelPackage.NODE__OUTGOING_CONNECTIONS:

refreshSourceConnections();

break;

}

}

还有active()/deactive()措施中的内容必要改动,感化照样把EditPart自己作为Adapter(不是 PropertyChangeListener了)加入模型的 监听 器列表,下面是SubjectPart的实现,此中eAdapters()获得 监听 器列表:

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之间存在一对多的包孕关系,这个关系的主要感化便是确保在保存模型时不会呈现 Danglin澳门24小时娱乐在线gHREFException,由于假如没有这个包孕关系,则Connection工具不会被包孕在任何Resource里。

在删除一个工具的时刻,必然要包管它不再包孕在Resource里,否则保存后的文件中会呈现很多空元素。对照轻易犯错的地方是对 Connection的处置惩罚,在删除连接的时刻,只是从源节点和目标节点里删除对这个连接的引用是不敷的,由于这样只是在界面上打消了两个节点间的连接线,而这个连接工具照样包孕在Diagram里的,以是还要调用从Diagram工具里删除它才对,DeleteConnectionCommand中的代码如下:

您可能还会对下面的文章感兴趣: