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

GEF理解系列六(2)

    博客分类:
  • GEF
 
阅读更多

三、删除结点时删除连接线

刚才我们已经完成了删除结点的操作。不过它有一个问题:结点是被删除了,可连在它上面的连接线还存在。这是一个很可笑しい的结果。所以这里我们要修改一下,删除结点时,把它上面的连接线也一并删除。
这个操作要关注的地方只有一个,就是删除结点命令。
之前我们说过,一个连接线要想被显示出来的条件。这里我们可以借助这个条件来实现连接线的删除:让连接线脱离源的目标。所以删除结点时要想把连接线一并删除,我们就要在删除结点时先得到结点的所有连接线,然后让这些连接线脱离源和目标。修改删除结点命令如下:

public class DeleteHelloWorldCommand extends Command {

 

      private DiagramRootContent content;

      private HelloWorldModel model;

 

     private List<AbstractConnectionModel> inputs = new ArrayList<AbstractConnectionModel>();

      private List<AbstractConnectionModel> outs = new ArrayList<AbstractConnectionModel>();

 

      public DeleteHelloWorldCommand(DiagramRootContent content,

                  HelloWorldModel model) {

            super();

            this.content = content;

            this.model = model;

            inputs.addAll(model.getInputs());

            outs.addAll(model.getOutputs());

      }

 

      @Override

      public void execute() {

            for (AbstractConnectionModel connection : inputs) {

                  connection.deattachSource();

                  connection.deattachTarget();

            }

            for (AbstractConnectionModel connection : outs) {

                  connection.deattachSource();

                  connection.deattachTarget();

            }

 

            content.removeChild(model);

      }

 

      @Override

      public void undo() {

            for (AbstractConnectionModel connection : inputs) {

                  connection.attachSource();

                  connection.attachTarget();

            }

            for (AbstractConnectionModel connection : outs) {

                  connection.attachSource();

                  connection.attachTarget();

            }

            content.addChild(model);

      }

}

我们增加了两个List分别用来存储所有的输入线和所有的输出线。
运行结果:
deleteNodeConnectionpreafterdeleteNodeConnections
              图:删除前                                           图:删除后
注意:我们之前在结点模型里有一个得到全部源连接线和目的连接线的方法,理论上是可以直接返回这两个list对象来进行删除的。但是这会造成一个并发异常的发生,因为在java里,List对象是一个非线程同步的对象。所以在顺序取对象的时候不能执行删除操作。因此这里的一个很简单的解决办法就是用另外的两个List去执行这个操作。这就相当于:List A = List B。从A中取值,在B中删除。
在java1.5里,新增加了一些线程同步的列表类。如果想直接用,且不发生异常的话,可以使用那些类做为List用。

四、删除连接线

到上面为止,我们就讲完了删除结点操作。这里我们要开始讲删除连线操作。这个现在就已经变得很简单了。从段三中,我们已经知道要使得一个连接被删除应该怎么做了:脱离源了目标。所以我们的问题就是怎么发出删除命令了/或者说怎么收到删除连接命令了。还是Policy。和选中连线一样,我们要删除一个连线,也应该在连线模型里增加Policy。
查找和连线有关的Policy,我们可以猜到大约是:ConnectionEditPolicy。因为其他的都不太像嘛。哈哈。
那好,找到了Policy,我们还是把它安装在所以连线上,所以在AbstractConnectionModelEditPart安装这个Policy。如下:

installEditPolicy(EditPolicy.CONNECTION_ROLE, new DeleteConnectionEditPolicy());

最后就是完成command,完成policy了。至于command怎么写,从上面的解释中大约大家都已经知道了,这里就直接给出代码:
删除命令:

public class DeleteConnectionCommand extends Command {

 

      private AbstractConnectionModel connection;

 

      public DeleteConnectionCommand(AbstractConnectionModel connection) {

            super();

            this.connection = connection;

      }

      @Override

      public void execute() {

            connection.deattachSource();

            connection.deattachTarget();

      }

      @Override

      public void undo() {

            connection.attachSource();

            connection.attachTarget();

      }

     

}

删除Policy:

public class DeleteConnectionEditPolicy extends ConnectionEditPolicy {

 

      @Override

      protected Command getDeleteCommand(GroupRequest request) {

            DeleteConnectionCommand command = new DeleteConnectionCommand((AbstractConnectionModel) getHost()

                        .getModel());

            return command;

      }

 

}

OK。完成了:
connectionPreDeleteconnectionafterdelete
               图:删除前                                       图:删除后
后记:其实我觉得吧,这个连接线删除应该自动被支持才对。呵呵。但是要怎么样自动被支持,我也不太清楚。在结点EditPart里再加一个要继承的方法?可行吗?
分享到:
评论

相关推荐

    GEF理解系列三

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

    GEF理解系列二

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

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

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

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

    2. **GEF框架**: - GEF提供了图形编辑的基础组件,如模型、视图、控制器(MVC)架构。 - 它提供了一套图形工具,如绘图工具、选择工具和连接线工具。 - 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入门实例代码2《Eclipse插件开发》中实例

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

    GEF教程

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

    GEF入门学习例子

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

    简单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

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

    界面设计GEF应用实例

    【描述】中的"六个小例子"是指通过一系列逐步进阶的教程,帮助开发者从基础到高级理解并掌握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