`
liugang594
  • 浏览: 984742 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

GEF理解系列一

    博客分类:
  • GEF
阅读更多
这两天又重新看了一下GEF。现在理解起来感觉比以前要容易的多了。这里就把一些心得整理一下,写了一个系列,以期与大家共同探讨。

一、创建Editor

      一般来说GEF都是用来实现一个Editor的。因此这里我也以Editor为例来说明。首先要做的一点就是实现一个Editor的扩展。具体怎么实现这里就不讨论,不明白的可以去找一个关于Eclipse插件开发方面的文章看看就知道了。
      可以有两种运行方式:一个种是插件方式;一种是RCP方式。具体到Editor本身来说,在这两种实现方式上运行的效果都是一样的。因此在后面的过程中,我们就忽略具体的运行方式,根据自己的喜好选择。
      要实现为一个GEF的Editor,我们扩展的Editor就需要继承自GEF的某个Editor实现。我们可以看一下Editor的一个类图:

editorH

图一:Editor类层次图

从图上被选中的那一层起就是GEF中的Editor类层级关系。GraphicalEditor是根类。我们的Editor可以直接实现这个类;如果想带有调色板(palette),则至少需要继承GraphicalEditorWithPalette;如果还想调色板(palette)可收缩,则可继承GraphicalEditorWithFlyoutPalette。在下面的过程中,我们就假设我们实现的都是带调色板(palette)的Editor。

二、添加EditDomain

noEditDomain

图二

      在步骤一中,我们已经有了一个可运行的Editor了。但是如果此时打开这个Editor,会得到一个异常。可以看到异常是发生在getCommandStack方法里的。如果查看GEF的源码就可以发现,这个空指针异常是由getEditDomain()返回的是一个空而造成的。

      在每个GEF的Editor里,都需要有一个EditDomain的存在。EditDomain是一个很重要的对象,它维护着GEF中的命令栈(所谓的命令栈就是一个用来存放命令的堆栈。GEF中的所有操作都是通过命令来完成的,这个命令栈就存储所有的这些操作命令。这也能方便的实现redo、undo操作)、负责事件通知等等。所以我们要给我们的Editor设置一个这样的EditDomain。

      一般说来我们直接在构造方法里使用一个DefaultEditDomain对象即可,例如:setEditDomain(new DefaultEditDomain(this));当然有可能你也需要实现自己的EditDomain,这超出了本文的讲解范围。

现在我们就有了一个可打开的Editor了,只是现在还没有内容而已。

三、MVC三部曲

      我们已经有了一个可运行的Editor了,暂时我们先不管这个Editor,我们来看另外一部分:GEF的MVC结构。

      GEF全称“图形编辑框架”。简单来说就是一个用来编辑图形的框架,也是一个典型的MVC结构框架。因此要实现一个GEF的应用,主要就是要实现MVC框架中的:模型、视图和控制。

首先:模型

      实现模型很简单,通常这部分是根据自己的应用需求来实现的。当然了你也可以用Eclipse里的EMF框架生成的一个应用模型。这里我们定义一个简单的应用模型:HelloWorld,它有一个text属性,有两个方法用来设置和取得这个text属性的值。如下:

helloworldmodel

图3

其次:控制器

      GEF中的控件器都需要实现某个EditPart类。一般来说普通的模型结点需要实现AbstractGraphicalEditPart;连接线需要实现AbstractConnectionEditPart等等。我们可以看一下类图:

editpartH

图四

      看我们的HelloWorld(红色圈住的)就继承了AbstractGraphicalEditPart类。需要实现至少两个方法:createFigure()(对应的显示部分)和createEditPolicies()(对应的操作部分)。这里暂时先不讲。

最后:视图

       GEF中的视图部分是由控制器(Editpart)负责创建的。看上面控制器部分,最后我们说到的需要实现的两个方法中,其中:createFigure()方法就是用来创建视图的。GEF的视图部分是由Draw2D负责完成的。可以到网上去找一些Draw2D的简单教程看看。例如我们的实现:

 

 @Override
 protected IFigure createFigure() {
  Label label = new Label();
  label.setBorder(new LineBorder(ColorConstants.red));
  HelloWorldModel helloworld = (HelloWorldModel) getModel();
  label.setText(helloworld.getText());
  label.setOpaque(true);
  label.setBackgroundColor(ColorConstants.yellow);
  return label;
 }
 

三者之间的关系

      应该来说MVC结构中,模型不应该知道任何有关图形的信息,也不应该包含图形的任何信息,模型和视图之间是通过控制器来打交道的。不过在GEF中,有时为了记住视图的一些状态,我们却不得不在模型中保存一些图形相关的信息,例如:图形大小、图形位置等等。这样当我们下次打开图形时,还可以保持它最后关闭时的状态。这点可能不是太好。在GMF中,这种状态终于有所改变了。GMF中每种模型都有一个view去专门处理图形的信息,而且保存的时候也可以把模型信息与图形信息进行分开保存。

      说上面的话,其实我只是想说下面的内容:在HelloWorld中添加一个属性用于保存图形的大小。所以现在我们的HelloWorld模型就变成了:

 

import org.eclipse.draw2d.geometry.Rectangle;
public class HelloWorldModel{
 private String text = "<unname>";
 
 private Rectangle constraints = new Rectangle(0,0,100,20);
 public String getText() {
  return text;
 }
 public void setText(String text) {
  this.text = text;
 }
 public Rectangle getConstraints() {
  return constraints;
 }
 public void setConstraints(Rectangle constraints) {
  this.constraints = constraints;
 }
}
 

将三者联结

最后就是将三者联结起来,这里用到了EditPartFactory类,例如:

 

public class DiagramEditPartFactory implements EditPartFactory {
 public EditPart createEditPart(EditPart context, Object model) {
  if(model instanceof HelloWorldModel){
   HelloWorldEditPart editPart = new HelloWorldEditPart();
   editPart.setModel(model);
   return editPart;
  }
  return null;
 }
}
 

这样我们就完成了一个模型对象的MVC结构。 假如可以运行的话,我们看到此时运行的效果应该是:

editor1

呵呵,现在什么都还没有。

如果我们还要再创建一个模型,就基本上是做重复运动了。这个在GEF是比较烦的一件事。所以在后面的才会出现GMF。只要给出一个能生成模型的东西,比如说XML schema、java annotaion、UML图等,它就自动帮你生成了一个Editor。那几乎是不要几分钟的事情。不过现在我们还得继续我们的事件。。。。

分享到:
评论

相关推荐

    GEF理解系列三

    在GEF(Graphical Editing Framework)中,理解其工作流程对于开发图形编辑工具至关重要。GEF主要用于构建基于SWT和JFace的图形用户界面,它提供了丰富的功能来处理图形元素的绘制、操作和交互。本篇文章将深入探讨...

    GEF理解系列二

    【GEF理解系列二】是深入学习GEF框架的第二部分,主要讲解如何配置和初始化Editor,以及如何创建多层结构以支持添加多个图形。GEF(Graphical Editing Framework)是一个用于构建图形编辑器的开源框架,常用于开发...

    Eclipse插件开发:GEF入门系列宝典

    GEF(Graphical Editing Framework)是Eclipse平台的一部分,专为构建图形化编辑器而设计,提供了一套强大的框架和服务,使得创建复杂的图形用户界面(GUI)变得更为简单。 在"GEF入门系列宝典"中,我们将深入探讨...

    GEF入门必读 GEF入门系列 GEF-whole-upload

    本资料集旨在为初学者提供一个全面的入门指南,帮助理解GEF的基础概念和实现方法。 GEF的核心功能是提供了一套强大的组件和API,用于创建可交互的、图形式的用户界面。通过使用GEF,开发者可以轻松地创建出具有拖放...

    GEF入门系列 pdf 格式资料

    本资料集合包含了一系列关于GEF的入门教程,旨在帮助初学者快速掌握GEF的基本概念、架构和应用。 **1. GEF的核心概念** - **模型-视图-控制器(MVC)**:GEF基于MVC设计模式,将图形元素的逻辑(模型)、显示(视图...

    GEF入门系列

    - 示例代码:Eclipse项目中包含多个GEF示例,是学习和理解GEF的好资料。 - 在线教程:互联网上有许多博客和教程,针对不同水平的学习者提供了丰富的教学内容。 通过这个GEF入门系列,你可以逐步掌握如何利用GEF...

    EMF_GEF_入门系列

    本入门系列旨在帮助初学者快速理解并掌握这两个强大的工具。 EMF是Eclipse项目的一部分,它提供了一种模型驱动的开发方式。EMF允许开发者创建、存储和操作数据模型,这些模型可以用来表示复杂的数据结构或业务逻辑...

    Eclipse插件开发--gef开发指南与入门系列宝典

    "GEF入门系列宝典.doc"可能更侧重于实践,提供逐步的教程和实例,帮助初学者快速上手。它可能包含一些实际的代码示例,教你如何构建一个简单的图形编辑器,例如绘制流程图或网络拓扑图。 通过学习这两份资料,你将...

    GEF-ALL-3.7+GEF-ALL-3.8+GEF_Draw2d学习资料

    2. "GEF入门系列(一、Draw2D).doc" 可能是一个逐步的教学系列,从基础的Draw2D开始,逐步引入GEF的概念和应用。 3. "如何在Eclipse3.3.1.1中安装VE,emf,GEF插件.doc" 提供了在特定版本的Eclipse中安装相关插件的步骤...

    GEF教程

    为了帮助读者更好地理解GEF框架的实际应用,作者提供了由简至繁的一系列示例项目。这些项目按序排列,从最简单的pt1开始,逐步添加新功能,最终形成一个具备DirectEdit、Palette等功能的图形编辑器。这种逐步递进的...

    GEF入门学习例子

    3. **图形绘制**: GEF提供了一系列类来支持图形的绘制,包括`Figure`、`RectangleFigure`、`EdgeFigure`等。用户可以自定义这些图形类,实现特定的绘制逻辑。 4. **移动、删除、撤销/重做**: 这些基本操作通过GEF的...

    GEF.rarGEF.rar

    10. **示例和教程**:GEF通常会提供一系列的示例项目和教程,帮助开发者快速上手,理解和使用框架。 总的来说,"GEF.rar"压缩包可能是为开发者提供的一个完整的开发环境,包括了源代码、必要的库文件以及示例,使得...

    简单gef框架

    4. **流程设计基础**:在gef框架下进行流程设计,首先要明确流程的目标和步骤,这可能涉及到对程序逻辑的理解和拆解,将复杂的任务分解为一系列可执行的子任务。这通常需要扎实的编程基础和问题解决能力。 5. **gef...

    GEF-ALL-3.4.2(1).zip

    GEF的核心设计理念是将图形编辑器的实现分解为一系列可重用的组件,这些组件可以组合起来创建各种定制化的图形编辑环境。这个框架的主要组成部分包括: 1. **Model**:模型是编辑器的数据基础,定义了图形元素的...

    GEF 入门教程 中文版

    - 自定义动作是指用户可以触发的一系列操作。 - 它可以是简单的动作,也可以是一组复杂操作的组合。 **知识点2:实现自定义动作** 1. **定义动作类**:继承自GEF的动作类,实现执行方法。 2. **注册动作**:将动作...

    gef-step3.zip_3gef_GEF eclipse_GEF-step2_gef_gef-st

    **3gef**可能是这个系列教程的一个特定版本或者阶段,强调了对GEF的三次迭代改进或深化理解。这可能涉及到更高级的功能,如图形的动态更新、自定义手势识别或者与其他Eclipse插件的集成。 **gef_eclipse**标签表明...

    GEF入门实例代码2《Eclipse插件开发》中实例

    GEF包含了一系列的类和接口,如Command、Model、View、EditPart、Figure等,它们共同构成了图形编辑的基础架构。Command代表可撤销/重做的操作,Model表示数据模型,View负责显示图形,EditPart作为模型和视图之间...

    gef工程代码

    总结来说,gef工程代码是一个强大的学习资源,对于想要提升调试技能和深入理解代码运行机制的开发者来说,是不可多得的宝藏。通过深入研究和实践,你将能够掌握gef的精髓,从而在日常开发和调试工作中更加游刃有余。

Global site tag (gtag.js) - Google Analytics