问题

在GMF中,如果需要programmatically删除节点或连线,在google中我们很容易搜索到《GMF中,删除节点和连线的实现》一文(我并不确定这是原创作者的原始链接),很多人可能都使用这种实现。这是一种很好的实现,但有时候也有其缺点--除了需要删除View和Edge外,还需要删除model,在element对应于各种不同的model时,显然需要写大量if else来处理不同的model。

实现

我们可以有另一种实现,通过request和command来实现,以下代码删除某个节点上所有的连线

	public void deleteConnections(ShapeNodeEditPart editpart)
{
CompoundCommand compoundCommand =new CompoundCommand("delete all connections");
List connections = editpart.getTargetConnections();
connections.addAll(editpart.getSourceConnections());
GroupRequest deleteReq = new GroupRequest(RequestConstants.REQ_DELETE);
deleteReq.setEditParts(connections);
for (int i = 0; i < connections.size(); i++) {
EditPart object = (EditPart) connections.get(i);
Command deleteCmd = object.getCommand(deleteReq);
if (deleteCmd != null)
compoundCommand.add(deleteCmd);
} editpart.getDiagramEditDomain().getDiagramCommandStack().execute(compoundCommand);
}

删除多个节点

public void deleteNodes(List editparts)
{
CompoundCommand compoundCommand =new CompoundCommand("delete nodes");
GroupRequest deleteReq = new GroupRequest(RequestConstants.REQ_DELETE); deleteReq.setEditParts(editparts);
for (int i = 0; i < editparts.size(); i++) {
EditPart object = (EditPart) editparts.get(i);
Command deleteCmd = object.getCommand(deleteReq);
if (deleteCmd != null)
compoundCommand.add(deleteCmd);
} ((ShapeNodeEditPart)editparts.get(0)).getDiagramEditDomain().getDiagramCommandStack().execute(compoundCommand);
}

这种方式的好处是,不必关心底层model的删除,因为每个element对应的command中,GMF已经帮我们实现了,更加简单,且符合开放-闭合原则。并且,undo和redo也已经实现。

 

参考

org.eclipse.gef.ui.actions.DeleteAction

 

Binhua Liu原创,写于2013/8/25。

GMF中,删除节点和连线的另一种实现的更多相关文章

  1. jQuery中删除节点方法remove()、detach()、empty()分析

    jQuery中提供了三种删除节点的方法:remove().detach().empty(),本文详细分析这三种方法. 最容易区分的是empty(),该方法严格上属于“清空节点”,即删除其子节点,自身并 ...

  2. 在Neo4j中删除节点中多个属性的方法

    译者言:本文介绍了如何批量删除节点的属性的方法,重点介绍了apoc.create.removeProperties 函数的使用. 今天早些时候,Irfan和我在一个数据集上做实验,运行了一些图形算法的 ...

  3. [leetcode]203. Remove Linked List Elements链表中删除节点

    这道题很基础也很重要 重点就是设置超前节点 public ListNode removeElements(ListNode head, int val) { //超前节点 ListNode pre = ...

  4. (转)js在数组中删除重复的元素自保留一个(两种实现思路)

    例如:var student = [‘qiang','ming','tao','li','liang','you','qiang','tao']; 第一种思路是:遍历要删除的数组arr, 把元素分别放 ...

  5. 【LeetCode题解】237_删除链表中的节点

    目录 237_删除链表中的节点 描述 解法 思路 Java 实现 Python 实现 237_删除链表中的节点 描述 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除 ...

  6. Hadoop日常维护系列——Hadoop添加删除节点

    添加节点 1.修改host    和普通的datanode一样.添加namenode的ip 2.修改namenode的配置文件conf/slaves    添加新增节点的ip或host 3.在新节点的 ...

  7. javascript中的链表结构—从链表中删除元素

    1.概念 上一个博文我们讲到链表,其中有一个方法remove()是暂时注释的,这个方法有点复杂,需要添加一个Previous()方法找到要删除的元素的前一个节点,这一个博文我们来分析一下这个remov ...

  8. Hadoop下添加节点和删除节点

    添加节点 1.修改host   和普通的datanode一样.添加namenode的ip 2.修改namenode的配置文件conf/slaves   添加新增节点的ip或host 3.在新节点的机器 ...

  9. CRS添加、删除节点

    一.如何删除一个节点: 1.1 在存活的节点上操作,使用dbca删除DB实例 1.2 清除ASM实例  在存活的节点上做如下操作  1.2.1 停止ASM实例    export ORACLE_HOM ...

随机推荐

  1. ssh框架开发问题

    Struts + spring MVC + hibernate   6.1   从职责上分为表示层.业务逻辑层.数据持久层和域模块层四层. 其中使用Struts作为系统的整体基础架构,负责MVC的分离 ...

  2. jQuery上定义插件并重设插件构造函数

    插件alert的全部代码,每个插件都定义在如下类似的作用域中: +function ($) { 'use strict'; // ALERT CLASS DEFINITION // ========= ...

  3. gif 图片制作和拆解

    http://app.baidu.com/app/enter?appid=120980 gif 制作http://app.baidu.com/app/enter?appid=143534 gif 分解

  4. 手机端开发icon的问题

    一般来说,手机端的图片能用字体(字体小的情况下)的话,效果更好,因为不受图片缩放的失真影响. 但是有时,用位图的话,图片材料要高清晰,用jpg的高质量. 另外,有彩图与灰度图的情况下,考虑使用css3 ...

  5. PHP 判断客户端是IOS还是Android

    <?php if(strpos($_SERVER['HTTP_USER_AGENT'], 'iPhone')||strpos($_SERVER['HTTP_USER_AGENT'], 'iPad ...

  6. 编写Java程序最容易犯的21种错误

    1.duplicated code 代码重复几乎是最常见的异味了.他也是refactoring的主要目标之一.代码重复往往来自于copy-and-paste的编程风格.与他相对应oaoo是一个好系统的 ...

  7. 【Apache】apache简单配置URL重写规则

    [概述]URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程.举个例子来说,如果通过浏览器进来的URL是index.php?type=news&& ...

  8. 解决SQLSERVER在还原数据时出现的“FILESTREAM功能被禁用”问题

    解决SQLSERVER在还原数据时出现的“FILESTREAM功能被禁用”问题 今天由于测试需要,在网上下载了Adventureworks2008实例数据库的BAK文件,进行还原时出现了这样的错误“F ...

  9. php日期,时间相关知识整理

    unix 时间戳:从1970年1月1日0点开始到当前时间所经过的秒数. 1.将日期转换为UNIX时间戳 mktime():可以自动校正越界的输入 原型 : mktime(hour,minute,sec ...

  10. 连接弹性和命令拦截的 ASP.NET MVC 应用程序中的实体框架

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    上篇博客我们学习了EF 之 MVC 排序,查询,分 ...