问题

在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. Spring注解详解

    概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...

  2. PHP数据运算优先级总结记忆

    运算符优先级

  3. which go

    http://www.yiibai.com/go/go_environment.html

  4. JS 的trim()

    去除字符串左右两端的空格,在vbscript里 可  用 trim.ltrim 或 rtrim,但 js 却没有这 3个 内置方法,需 手工编写.下面的实现方法  用到 正则表达式,效率不错, 把 三 ...

  5. mysql数据库、表、字段、记录:增、删、改、查

    /* 结构:数据库.表.字段.记录 操作:增删改查 */ -- 1.数据库:增删改查 create datebase if not exists jkxy; drop database if exis ...

  6. Git commit 常见用法

        Git commit git commit 主要是将用户通过git add命令添加到暂存区里的改动给提交到本地的版本库,关于版本库的构成可以查看我先前的笔记. 每次提交我们都会在本地版本库生成 ...

  7. 使用curl命令操作elasticsearch

    使用curl命令操作elasticsearch 大岩不灿 发表于 2015年4月25日 浏览 7,426 次 第一:_cat系列_cat系列提供了一系列查询elasticsearch集群状态的接口.你 ...

  8. AngularJS Best Practices: Directory Structure

    app/----- common/ // Acts as reusable components for your app---------- header/--------------- contr ...

  9. [Android Tips] 17. Check APK Sign Info

    $ jarsigner -verify -verbose -certs <apk file path> 查看 keystore $ keytool -list -keystore debu ...

  10. R&&rstudio

    R sudo apt-get install R-base Rstudio()下载Rstudio桌面版失败 sudo apt-get install gdebi-core 如果提示少了什么东西,运行下 ...