博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GMF树形布局 3 展开/折叠时更换Node图标
阅读量:6413 次
发布时间:2019-06-23

本文共 2148 字,大约阅读时间需要 7 分钟。

hot3.png

前一篇博客实现了展开/折叠,但是如果当节点折叠时图标可以发生变化,例如变成加号,那就直观了。这篇博客解决这个问题。

具体步骤如下:

1、首先,将两个图标文件放在diagram工程下的icons\custom下,并刷新这个工程,如下图所示:

2、修改Topic节点图标的地方,在TopicNameEditPart中的getLabelIcon()方法中,需要将它修改。具体思路是:检查其父类即TopicEditPart所对应的的模型的isExpanded成员变量,如果是false,则返回加号图像,否则,返回Topic图像。

修改getLabelIcon()方法如下:

/** * @generated NOT */protected Image getLabelIcon() {    EObject parserElement = getParserElement();    if (parserElement == null) {        return null;    }    return this.createLabelIconImage();}

3、在TopicNameEditPart中添加createLabelIconImage()方法:

/** * 根据父模型,创建标签图标 */private Image createLabelIconImage() {    Image labelIconImage = null;    // 刚开始时,根据parentEditPart的模型中的属性,创建labelIconImage    Topic parentModel = (Topic) ((View) this.getParent().getModel())            .getElement();    if (parentModel.isExpanded()) {        ImageDescriptor descriptor = MindmapDiagramEditorPlugin                .findImageDescriptor("icons/custom/Topic.gif");        labelIconImage = descriptor.createImage();    } else {        ImageDescriptor descriptor = MindmapDiagramEditorPlugin                .findImageDescriptor("icons/custom/plus.png");        labelIconImage = descriptor.createImage();    }    return labelIconImage;}

4、此时运行,当展开或者折叠时图标不会马上改变,但是保存、关闭之后,再打开,图标是发生变化的。解决这个问题,需要在执行展开/折叠的命令中刷新一下节点的标签。

在ExpandOrCollapseCommand中doExecute()方法中this.doExpandOrCollapse()语句后边加上

((EditPart) this.topicEditPart.getChildren().get(0)).refresh();

5、如果这个时候再运行,执行展开或者折叠时,图标就会相应的发生变换了。但是,由于使用命令执行,当使用Redo/Undo时,图标还是不能发生改变。为了解决这个问题,想要重写ExpandOrCollapseCommand的redo()和undo()方法,但是,由于父类RecordingCommand将这两个方法设为final,不能重写。因而想到按照RecordingCommand写一个CustomRecordingCommand,在其中将这两个方法的final去掉。从网上找到了RecordingCommand的源码,按照上面将redo()和undo()方法的final去掉,然后修改ExpandOrCollapseCommand继承自CustomRecordingCommand,重写redo()和undo()方法如下:

@Overridepublic void undo() {    super.undo();    topicModel.setExpanded(isExpanded);    ((EditPart) this.topicEditPart.getChildren().get(0)).refresh();}@Overridepublic void redo() {    super.redo();    topicModel.setExpanded(!isExpanded);    ((EditPart) this.topicEditPart.getChildren().get(0)).refresh();}

6、最终效果如下图:

最终代码在

转载于:https://my.oschina.net/plumsoft/blog/153406

你可能感兴趣的文章
Generating Pods project failed
查看>>
搭建mysql主从复制教程
查看>>
Electron-如何保护源码?
查看>>
mysql索引
查看>>
高效 实现长连接保活:手把手教你实现 自适应的心跳保活机制
查看>>
webpack一些简单配置讲解
查看>>
18.11.1 - 基础(快速排序)
查看>>
ES6--var-let-const(ms)
查看>>
LeetCode 第 23 号问题:合并 K 个排序链表
查看>>
填坑-十万个为什么?(5)
查看>>
区块链软件公司:区块链中的签名怎样签?
查看>>
css百分比的应用
查看>>
Flutter开发一 Flutter Widget 之MaterialApp,Scaffold联系与区别
查看>>
Nuxt入门总结
查看>>
apply、call、bind的学习总结
查看>>
一、浅谈前端的2D、3D转换,以及动画的定义和调用(关于2D的一些操作)
查看>>
Python中关于++和—(自增和自减)的理解
查看>>
万物链、Ruff、沃尔顿链 物联网产品小结
查看>>
java常用jar包
查看>>
004-Java语言特点
查看>>