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

GEF理解系列二

    博客分类:
  • GEF
阅读更多
系列一中,我们完成了一个MVC结构,并初步构造了一个Editor,不过到现在Editor里什么东西都还没有,这节中我们要给它加一点东西。

一、配置和初始化Editor

要想让Editor真正开始工作,我们就需要做一些基础工作了。我们可以看到,当我们写了一个继承自GraphicalEditorWithPalette类的editor时,默认有几个方法需要实现。其中有一个方法:initializeGraphicalViewer()。看名字就知道这是一个用来初始化editor的方法。比如说editor一打开有什么内容等等就是在这里做的,我们可以给它加一个HelloWorldModel。另外,我们在系列一最后部分创建了一个EditPartFactory,我们需要把它配置到我们的Editor上去,这个也可以在initializeGraphicalViewer()方法里完成。不过,这里我们可以实现另一个方法:configureGraphicalViewer()。在那里完成也行。这里因此最后我们还需要配置一些东西,所以EditPartFactory就在方法configureGraphicalViewer()里完成。这样,内容分别如下:
 @Override
 protected void initializeGraphicalViewer() {
  getGraphicalViewer().setContents(new HelloWorldModel());
 }
 @Override
 protected void configureGraphicalViewer() {
  super.configureGraphicalViewer();
  getGraphicalViewer().setEditPartFactory(new DiagramEditPartFactory());
 }

简单来说:initializeGraphicalViewer里实现一些初始化的的东西,例如内容;configureGraphicalViewer实现一些配置的东西,例如factory,rootpane。

我们看一下此时的效果:

editor2

图一

呵呵,已经出了一个图了。只是有点死板而已。好像图有点大。下面我们来做一些改变(临时方式)。

在系列一,我们最后修改了一下HelloWorldModel,给它添加了一个属性constraint,用来设置图形的大小和位置。这里我们就要用到它了。

首先我们修改一下HelloWorldEditPart的createFigure()方法,追加一句,如下:label.setBounds(helloworld.getConstraints());
再运行,发现效果还是没变化。这是因为Editor默认的rootEditPart是ScalableRootEditPart,看doc里描述这种类型的RootEditPart会自动让图层填满整个空间。我们把它修改一下即可。在Editor的configureGraphicalViewer()方法里追加一句:getGraphicalViewer().setRootEditPart(new ScalableFreeformRootEditPart());即可,这是一个支持伸缩功能的RootEditPart,一般情况下我们都可以以此对象作为RootEditPart。
再运行看效果:

editor3

图二

呵呵,已经有点样子。不过现在的问题就是加来加去,也只加一个图形。要怎么才能加更多的图形呢?

二、创建多层结构

为了能添加更多的图形,我们需要再创建一层模型,用来包括0个或多个HelloWorldModel,然后把这个新模型作为Editor的contents。暂且把我们的新的模型命名为:DiagramRootContent。一般来说我们都可以通过多加一些对象层来实现对多个对象的组合、分拆,例如对于一个类模型,我们可以直接用类模型管理变量和方法,也可以新增加一个是间层:方法层和变量层;类只关心这两个层,然后让它们分别关心变量和方法, 这样整个模型结构会显得更清淅。

多了不说,因为新增加了对象,还是那三部曲重写一次过程。不过需要多说一点是:因为这个新的模型只是一个用来包含其他模型的容器,因此显然:需要有一个用来指示所有的子模型的变量和分别用来增加了移除子模型的方法。好,这差不多就够了。先写出来再说:
public class DiagramRootContent {
 private List<HelloWorldModel> children = new ArrayList<HelloWorldModel>();
 public void addChild(HelloWorldModel child) {
  if (!children.contains(child)) {
   children.add(child);
  }
 }
 public void removeChild(HelloWorldModel child) {
  if (children.contains(child)) {
   children.remove(child);
  }
 }
 public List<HelloWorldModel> getChildren(){
  return children;
 }
}
 
再创建一个对应的EditPart。
public class DiagramRootContentEditPart extends AbstractGraphicalEditPart {
 @Override
 protected IFigure createFigure() {
  ScalableFreeformLayeredPane layer = new ScalableFreeformLayeredPane();
  layer.setLayoutManager(new FreeformLayout());
  return layer;
 }
 @Override
 protected void createEditPolicies() {
 }
}

一个好的实践是对于每个Model,都实现对应的Editpart。

这里要注意:和SWT一样,容器的Figure要记得设置布局,要不子元素可能就显示不出来了。这里我设置的是FreeformLayout。
最后,在EditPartFactory里追加一段,用于关联这些对象:
if(model instanceof DiagramRootContent){
   DiagramRootContentEditPart editPart = new DiagramRootContentEditPart();
   editPart.setModel(model);
   return editPart;
 }
 
好了,一个新模型的MVC结构就定义好了。最后,为了让Editor显示这个新的内容,我们还是修改Editor的initializeGraphicalViewer()方法。例如:
 @Override
 protected void initializeGraphicalViewer() {
  HelloWorldModel model1 = new HelloWorldModel();
  model1.setConstraints(new Rectangle(0,0,100,20));
  
  HelloWorldModel model2 = new HelloWorldModel();
  model2.setConstraints(new Rectangle(100,50,100,20));
  
  HelloWorldModel model3 = new HelloWorldModel();
  model3.setConstraints(new Rectangle(50,100,100,20));
  
  DiagramRootContent content = new DiagramRootContent();
  content.addChild(model1);
  content.addChild(model2);
  content.addChild(model3);
  getGraphicalViewer().setContents(content);
 }
 
运行一下试试。有效果吗?好像没有。为什么没有呢?

在GEF中,有一些“关键”方法的存在。正是因为这些“关键”方法的存在才使得我们能够正确的完成各种任务。关键一词我打个引号,因为是我自己的理解。
回想一下上面:我们的确构造了一个content模型,里面的确有一个属性用来存所有的子模型。但是这只是我们自己的理解,GEF怎么知道是哪个属性代表所有的子模型呢?我们得有一个地方告诉它啊。对吧?有道理没?其实这样的地方有很多的,比如说后面要讲到连接。先不扯远了,把当前的事情 做完。
我们再看看Content的EditPart。看看还有没有什么其他的方法需要重写。有一个:getModelChildren()。意思就是说得到模型的子。不要选成了getChildren()哦。就像后面的连接一样,也要选getModel**,这个稍记一下就行了。
好了,重写这个方法如下:
 @Override
 protected List<HelloWorldModel> getModelChildren() {
  return ((DiagramRootContent)getModel()).getChildren();
 }
 
再运行一下:

editor4

图3

OK,图形成功被显示出来了。

这一部分就到这,接下来就是讲更进一步的内容了。

小提示:如果以上过程中,图出来显示的不一样,或者是图不出来。那有可能是你的图元选择不一样,或者是图元设置不一样。比如说透明之类的。 (废话)

分享到:
评论
1 楼 zhazha1984 2009-02-18  

相关推荐

    GEF理解系列三

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

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

    2. **GEF框架**: - GEF提供了图形编辑的基础组件,如模型、视图、控制器(MVC)架构。 - 它提供了一套图形工具,如绘图工具、选择工具和连接线工具。 - GEF支持命令模式,使得操作可以撤销/重做。 - 它还包含...

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

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

    GEF入门系列 pdf 格式资料

    **GEF入门系列 PDF 格式资料** GEF(Graphical Editing Framework)是Eclipse开源组织推出的一个图形编辑框架,主要用于构建可视化的图形编辑...在阅读过程中,建议结合实际编程实践,以便更好地理解和掌握GEF的精髓。

    GEF入门系列

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

    EMF_GEF_入门系列

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

    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中安装相关插件的步骤...

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

    2. GEF的基本概念:深入理解模型、表示层、编辑器和控制器的概念。 3. 编辑器的生命周期:学习编辑器的创建、打开、保存和关闭过程。 4. 图形元素的定义:创建自定义的图形节点和连接线,定义它们的外观和行为。 5. ...

    GEF入门学习例子

    这个入门学习例子旨在帮助初学者理解GEF的基本用法和核心概念,通过实例展示如何利用GEF实现工具栏、菜单栏、属性栏以及图形的交互功能,如移动、删除、撤销、连线等,并涵盖了大纲视图和鹰眼功能的实现。...

    GEF教程

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

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

    这个实例代码2是《Eclipse插件开发》教程中的一部分,旨在帮助初学者理解如何利用GEF来创建自定义的图形编辑器。在Eclipse插件开发中,GEF提供了一套强大的框架,使得开发者可以方便地构建出功能丰富的图形用户界面...

    GEF.rarGEF.rar

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

    简单gef框架

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

    GEF 入门教程 中文版

    ### GEF(Graphical Editing Framework)入门教程知识点详解 #### 一、简介 GEF(Graphical Editing Framework),即图形编辑框架,是一种基于...希望您能够通过实践加深对GEF的理解,并成功地应用于自己的项目中。

    GEF基础知识

    - **Control(控制器)**:这部分主要是由一系列`EditPart`组成,它们是GEF的核心组件。每个`EditPart`都对应于模型中的某个元素,并负责处理用户交互。 #### 四、Draw2D的核心组件——LightweightSystem **...

    gef-step3.zip_3gef_GEF eclipse_GEF-step2_gef_gef-st

    **gef-step2**可能是指系列教程的第二部分,可能涵盖了基本的GEF概念、工作台管理器、图元工厂、图形模型以及视图和编辑区的创建。在这一阶段,学习者通常会接触到如何构建基本的图形界面和实现简单的交互。 **gef-...

    eclipse_gef_example.rar

    这个"eclipse_gef_example.rar"压缩包提供了一系列的例子,帮助开发者更好地理解和掌握GEF框架。以下是对每个部分的详细解释: 1. **org.eclipse.gef.examples.text** 这个部分主要展示了如何在GEF环境中处理文本...

Global site tag (gtag.js) - Google Analytics