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

GEF理解系列四(1)

    博客分类:
  • GEF
阅读更多

在开始之前,我们先讲一点预备的(我自己的理解,如果有错不能怪我)。

1.      GEF中,一个连接线模型要成功创建,则这个模型必须有个源和目标。大家可以试一下连接一个源,再把目的随便在某个点一下,线是不会出来的(当然如果任务一个点都可以是目标的话,那就另论了)。

2.      GEF中,一个连接线模型即使已经被附着到了源和目的上,也不一定会被显示出来。这就要提到AbstractGraphicalEditPart的两个方法:getModelSourceConnections()getModelTargetConnections()。在前面讲getModelChildren()方法时提到过。这两个方法就是用来返回结点上的源连接线和目的连接线。所以其实我们真正要保证的是这两个方法返回的结果正确。

3.      GEF中,一个模型对象要支持连接,它的EditPart必须实现一个接口:NodeEditPart。实现这个接口主要就是要实现它的四个方法用来确定连接线的锚点。一般来说简单的返回一个ChopboxAnchor对象就可以。当然也可以自己实现自定义的锚点算法。

首先、把结点对象定义好。

还是以我们的HelloWorldModel作为结点对象。按照上面所说进行动作。为了记录结点对象的源和目的线,首先我们加两上List和几个方法来存储和操作这些连接线。如下:

      private List inputs = new ArrayList();

      private List outputs = new ArrayList();

 

      public List getInputs() {

            return inputs;

      }

 

      public List getOutputs() {

            return outputs;

      }

 

      public void addInput(AbstractConnectionModel model) {

            if (!inputs.contains(model)) {

                  inputs.add(model);

            }

      }

 

      public void addOut(AbstractConnectionModel model) {

            if (!outputs.contains(model)) {

                  outputs.add(model);

            }

      }

 

      public void removeInput(AbstractConnectionModel model) {

            if (inputs.contains(model)) {

                  inputs.remove(model);

            }

      }

 

      public void removeOut(AbstractConnectionModel model) {

            if (outputs.contains(model)) {

                  outputs.remove(model);

            }

      }

这里因为要先用到,所以先假设所有的连接线的模型都继承自AbstractConnectionModel

其次、修改结点的EditPart

HelloWorldEditPart实现接口 NodeEditPart。然后完成以下方法:

      public ConnectionAnchor getSourceConnectionAnchor(

                  ConnectionEditPart connection) {

            return new ChopboxAnchor(getFigure());

      }

 

      public ConnectionAnchor getSourceConnectionAnchor(Request request) {

            return new ChopboxAnchor(getFigure());

      }

 

      public ConnectionAnchor getTargetConnectionAnchor(

                  ConnectionEditPart connection) {

            return new ChopboxAnchor(getFigure());

      }

 

      public ConnectionAnchor getTargetConnectionAnchor(Request request) {

            return new ChopboxAnchor(getFigure());

      }

      @Override

      protected List getModelSourceConnections() {

            return ((HelloWorldModel)getModel()).getOutputs();

      }

     

      @Override

      protected List getModelTargetConnections() {

            return ((HelloWorldModel)getModel()).getInputs();

      }

这样,我们的结点模型就修改完了。

一、添加连接线的MVC结构。

需要注意的是,在GEF里,连接线也被当作一个模型来对待,因此我们首先就是要创建:模型、视图和控制。

注意:在前面已经说过,这里的连接EditPart需要继承:AbstractConnectionEditPart

 

1.创建模型

按照刚才的说法,我们的连接线要继续自AbstractConnectionModel。之所以这样,是因为连接线的类型可能有多种,比如说带箭头的、不带箭头的;有路由点的、没有路由点的。但我们假设有一些是相通的:每个连接线只能有一个源、一个目的。所以我们的AbstractConnectionModel,可以实现如下:

public abstract class AbstractConnectionModel {

 

      private HelloWorldModel src;

      private HelloWorldModel target;

      public HelloWorldModel getSrc() {

            return src;

      }

      public void setSrc(HelloWorldModel src) {

            this.src = src;

      }

      public HelloWorldModel getTarget() {

            return target;

      }

      public void setTarget(HelloWorldModel target) {

            this.target = target;

      }

      public void attachSource(){

            if(!src.getOutputs().contains(this)){

                  src.addOut(this);

            }

      }

      public void attachTarget(){

            if(!target.getInputs().contains(this)){

                  target.addInput(this);

            }

      }

      public void deattachSource(){

            if(src.getOutputs().contains(this)){

                  src.removeOut(this);

            }

      }

      public void deattachTarget(){

            if(target.getInputs().contains(this)){

                  target.removeInput(this);

            }

      }

}

我们再写一个类:PlainConnectionModel继承这个类。什么都不用写。这就表示一个普通的连接线。

2。创建EditPart

我们创建一个PlainConnectionEditPart类,按照上面说的,这个类要继承:AbstractConnectionEditPart。内容暂时可以为空。

3。创建视图

视图可以先不管,因为连接线会有一个默认的视图。

4。关联MVC

EditPartFactory里追加它们的关联:

if(model instanceof PlainConnectionModel){

      PlainConnectionEditPart editPart = new PlainConnectionEditPart();

      editPart.setModel(model);

      return editPart;

}

我们先试一下效果。

修改EditorinitializeGraphicalViewer()方法。追加一个连接对象,如下:

      @Override

      protected void initializeGraphicalViewer() {

            HelloWorldModel model1 = new HelloWorldModel();

            model1.setConstraints(new Rectangle(10,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));

           

            PlainConnectionModel connection = new PlainConnectionModel();

            connection.setSrc(model1);

            connection.setTarget(model2);

            connection.attachSource();

            connection.attachTarget();

           

            DiagramRootContent content = new DiagramRootContent();

            content.addChild(model1);

            content.addChild(model2);

            content.addChild(model3);

            getGraphicalViewer().setContents(content);

      }

运行效果如下:

connection1

图一

连接线已经被加上了。

分享到:
评论
2 楼 liugang594 2008-07-01  
这个不是模型的问题吧?应该是画界面的问题吧?你就想办法把图片放到你的控件上去就行了!
1 楼 zenghongwei 2008-06-30  
你好,问一个问题:
我建立了两个模型Amodel、Bmodel。这两个模型对应的视图我使用的两张GIF图像AFigure、Bfigure。其中Bmodel是Amodel的子节点。我现在想在Afigure上显示Bfigure,试了很久没有成功。能给点建议吗?

相关推荐

    GEF理解系列1

    【GEF理解系列1】是关于图形编辑框架(GEF,Graphical Editing Framework)学习的第一部分,对于理解和使用GEF进行图形化应用开发至关重要。GEF是一个强大的Java库,用于构建可视化的图形编辑器,它提供了创建、编辑...

    GEF理解系列三

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

    GEF理解系列二

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

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

    1. **基本概念**:介绍GEF的关键概念,如Figure、EditPart、Command、Model等,以及它们在图形编辑中的角色。 2. **图形组件**:讲解如何创建和操作图形元素,如矩形、圆形、文本等,以及如何添加连接线和组合图形。...

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

    在"GEF入门系列宝典"中,我们将深入探讨如何使用GEF进行Eclipse插件开发,以创建自定义的图形编辑器。以下是一些关键知识点: 1. **Eclipse插件体系结构**: - 插件是Eclipse的核心组成部分,它们通过OSGi模块系统...

    GEF入门系列 pdf 格式资料

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

    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入门学习例子

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

    GEF-ALL-3.4.2(1).zip

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

    简单gef框架

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

    GEF 入门教程 中文版

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

    gef-step3.zip_3gef_GEF eclipse_GEF-step2_gef_gef-st

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

    eclipse_gef_example.rar

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

    gef工程代码

    1. **内存分析**:gef提供了查看和分析内存块、跟踪内存分配和释放、查找内存泄漏的命令。 2. **反汇编和指令分析**:gef可以展示程序的反汇编代码,帮助理解执行流程,并能解析和操作寄存器。 3. **调试信息**:gef...

    GEF Description

    GEF 提供了一系列组件和技术,帮助开发者轻松地解决上述问题。 ##### 3.1 数据模型与视图的关联 GEF 通过引入“模型-视图-控制器”(Model-View-Controller,MVC)架构模式,将数据模型、视图和控制器分开处理,...

Global site tag (gtag.js) - Google Analytics