15 分钟学会 Eclipse GMF
2017-08-30 17:10 nigaopeng 阅读(1562) 评论(0) 编辑 收藏 举报背景
坦白说:过去在 Eclipse 里使用 Graphical Editor Framework(GEF)创建图形化编辑器 既慢又痛苦。这个过程包括理解复杂的框架和大量的冗余代码。但也说明 GEF 是创建图形化编辑器的最佳框架,因为它与模型无关。另一方面,与模型无关本身也有一些问题。
GEF 是 Model-View-Controller(MVC)机制的精髓,它允许将您自己的模型引入表中。在使用 GEF 的早期,大多数人还使用自定义模型(考虑传统 Java 对象 [Plain Old Java™ Object, POJO])。您会发现自定义模型带来的问题是需要自己编写通用代码来支持模型,如序列化及侦听模型更改的功能。
在 GEF 中使用模型的下一个逻辑步骤是要使用 Eclipse Modeling Framework(EMF),EMF 提供了以各种形式将模型序列化的工具和侦听对模型默认值的更改的功能。
但是,将 EMF 模型与 GEF 框架整合在一起有一定的技术难度(如不同的命令堆栈),导致 EMF 模型并没有很快被基于 GEF 的编辑器接受。最终,GMF 项目在这种逆境中应运而生,并希望能够引入一种快速生成图形化编辑器的方法。通过类似的方法,EMF 生成适用于 EMF 模型的基本编辑器。
创建 EMF 模型
创建模型的第一步就是定义 EMF 模型的协作对象。我写这篇文章的目的只是说明定义模型的过程,而不是深入讲解 EMF 提供的模型处理工具的用法。本例中将要使用的模型是一个简单的图形化模型。我将通过一张图来帮助我说明模型的外观。
图 1. 可视的图形化模型
如您所见,使用模型是帮助我们理解各部分之间关系的一种简单方法。这个模型由图形、连接和图形化图表组成。
EMF 支持通过多种方法定义模型。为简单起见,我决定使用加注的 Java 技术。下面的代码清单说明了如何使用 EMF 定义模型。第一个模型对象是一个有名称属性、源连接和目标连接(Connection
类型)的图形。请注意,这是一个抽象的 EMF 类。
清单 1. Shape.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/** * @model abstract="true" */ public interface Shape { /** * @model */ String getName(); /** * @model type="com.ibm.model.shapes.model.Connection" containment="true" */ List getSourceConnections(); /** * @model type="com.ibm.model.shapes.model.Connection" */ List getTargetConnections(); } |
接下来定义囊括所有图形的列表的图形化图表。
清单 2. ShapesDiagram.java
1
2
3
4
5
6
7
8
9
|
/** * @model */ public interface ShapesDiagram { /** * @model type="com.ibm.model.shapes.model.Shape" containment="true" */ List getShapes(); } |
接下来定义一些特殊的图形使模型更加生动。
清单 3. RectangularShape.java
1
2
3
4
|
/** * @model */ public interface RectangularShape extends Shape {} |
清单 4. EllipticalShape.java
1
2
3
4
|
/** * @model */ public interface EllipticalShape extends Shape {} |
最后,再添上连接就可以了,这样就能将各种图形真正连接在一起。
清单 5. Connection.java
1
2
3
4
5
6
7
8
9
10
|
/** * @model */ public interface Connection { /** @model */ Shape getSource(); /** @model */ Shape getTarget(); } |
使用 Java 编程语言定义了模型后,请单击 File > New > Eclipse Modeling Framework > EMF Model(参见图 2)定义一个新的 EMF genmodel。注意:如果还没有 EMF 项目,就先创建一个。
图 2. EMF 加注的 Java importer
创建了 EMF genmodel 后,请在文件上单击鼠标右键,并确保生成 Model 和 Edit 组件(您只需选择 Generate All 就可以轻松地完成)。
创建 GMF 模型
GMF 需要您先创建一组模型,然后生成图形化编辑器。图 3 显示了创建这些模型所涉及的过程。我们需要使用的第一个模型是图形化定义,它定义了编辑器生成后的视觉效果。接下来是工具定义,它包括与编辑器面板、菜单等相关的事务。最后,还需要一个模型就是映射定义,相信您猜得到,它用于定义业务逻辑(EMF 图形化模型)与可视化模型(图形化和工具定义)之间的映射。
图 3. GMF 概览(来自 GMF 维基)
GMF 有个叫 GMF 指示板(Window > Show View > Other > GMF Dashboard)的实用程序非常好。它可以帮助您用一种简单的方法完成图形化编辑器生成过程。在这个阶段,您必须选定域模型和域 genmodel。
图 4. GMF 指示板
GMF 图形化定义模型
需要创建的第一个模型是图形化定义模型(在指示板的 Graphical Def Model 下单击创建超级链接)。确保选择 Canvas 为模型对象。这个模型很容易创建:
- 创建图表中显示的图。方法是在编辑器中创建一个新的 Figure Gallery 条目,然后创建各种图。
- 创建图表中显示的节点(矩形和椭圆形)。
- 在图表中创建连接。
- 确保每个节点都与图库中创建的图相匹配。
注意:如果您在执行此任务时遇到问题,您可以下载一个样例插件,此插件为您准备好了所有模型。
图 5. GMF 图解模型
GMF 工具定义模型
这个步骤需要定义工具定义模型,使用此模型可以定义图形化编辑器的信息类面板和菜单。要定义工具定义模型,请打开 GMF 指示板,然后单击 Create。我们的简单模型只需定义一个面板和一些创建工具来辅助创建模型(参见图 6)。
图 6. GMF 工具模型
GMF 映射定义模型
所有工作都从映射定义模型 开始。在此模型中,我们将可视化(图形)模型映射到业务逻辑(域模型)中。GMF 有一组有序向导可以帮助您创建映射定义。请通过 File > New > Graphical Modeling Framework > Guide GMFMap Creation 调用这组向导。第一步要选择所有 GMF 模型(参见图 7)。
图 7. GMFMap 向导 1
接下来,向导将智能地提示我们选择要使用哪个模型元素作为图表根元素。在我们举的例子中,此模型元素为 ShapesDiagram。
图 8. GMFMap 向导 2
最后,GMF 会像变魔术一样算出哪些模型元素必须映射到哪些可视化元素上。
图 9. GMFMap 向导 3
必须注意的是:这些向导可能会随着 GMF 的发展而改变。据说使用 GMF 自身提供的图形化编辑器就可以帮助创建映射定义文件(和其他 GMF 模型)。
生成 GMF 编辑器
整个过程的最后一步也是最有趣的一步是生成图形化编辑器。这需要您先通过映射定义模型创建一个 GMFGen 模型。然后,在映射定义文件上单击鼠标右键并选择 Create generator model...。这样,一个包含使用图形化编辑器所需的全部代码的新项目就生成了。要使用图形化编辑器,请启动一个新的 Eclipse 运行时工作台,然后转到 File > New > Examples > Model Diagram(参见图 10)。
图 10. 模型向导
模型文件创建后,您就应当能够使用生成的编辑器了(参见图 11)。很不错,是吧?
图 11. 图形编辑器
GMF 特点
必须注意的是:我们构造并生成的编辑器仅用到了 GMF 功能的一小部分。您可以做很多改动来利用框架的高级功能。
例如,GMF 支持验证。这句话的含义是:如果我们要限定图形化模型,只许与每个模型元素有一个连接会怎样?只允许相似的元素相互连接,还是对可用于图形的名称类型进行控制?GMF 完全能够支持这些类型的验证,甚至其他验证。对于验证,GMF 利用了 Eclipse Modeling Framework Technology(EMFT)来支持涉及使用 Java 代码和对象约束语言(Object Constraint Language,OCL)来定义验证器的情况。GMF 将给未通过验证的文件安插错误标记,这类似于 Eclipse 对未编译的 Java 文件的处理方法。要查看关于 GMF 支持内容的更多信息,请参阅 参考资料。
结束语
我的目的有两个:一是展示支持模型驱动开发的 Eclipse Callisto 发行版中令人兴奋的新的一面;二是让您了解它有多棒,只需 15 分钟就能在 Eclipse 中生成图形化编辑器。
原文链接: https://www.ibm.com/developerworks/cn/opensource/os-ecl-gmf/#artrelatedtopics