GEF调色板中的多级树结构
在GEF中的调色板(工具箱)是个树形结构,如果你GEF的Editor是继承至GraphicalEditorWithFlyoutPalette类的话,其中必须实现一个叫getPaletteRoot()的方法,它要求你返回一个PaletteRoot对象,其实它就是调色板树的根节点对象。
在调色板树的根节点(PaletteRoot)下,我们一般会放一些工具组(PaletteGroup)或抽屉(PaletteDrawer)来装一些画图的模型,最常见的就是选择工具(SelectionToolEntry)和连接线工具(CreationToolEntry)了,如果我想在“工具组”文件夹下放一个选择工具和连接线工具,我们可以这样写:
// 建立调色板的根节点对象root,最后返回给的也是root
PaletteRoot root = new PaletteRoot();
// 创建一个工具组用于放置常规Tools
PaletteGroup toolGroup = new PaletteGroup("工具组");
// 创建一个GEF提供的selection工具并将其放入toolgroup中
ToolEntry selectTool = new SelectionToolEntry();
// 添加到组中
toolGroup.add(selectTool);
// 该选择的工具是缺省被选择的工具
root.setDefaultEntry(selectTool);
ImageDescriptor descriptor = AbstractUIPlugin
.imageDescriptorFromPlugin(Activator.PLUGIN_ID,
IDmImageKey.CONNECTION);
String combineConnectionLine = "集成连接线";
// 创建连接线工具
CreationToolEntry connectionLine = new ConnectionCreationToolEntry(
combineConnectionLine, combineConnectionLine, new SimpleFactory (NormalConnectionModel.class),descriptor, descriptor);
connectionLine.setToolClass(ScoreCardConnectionCreationTool.class);
// 将连接线添加到组中
toolGroup.add(connectionLine);
root.add(toolGroup);
效果类似如下:
有人会问,为什么不见“工具组”文件夹,呵呵,这是因为PaletteGroup是不显示标题的。
如果是添加自定义的绘图工具,可以用到PaletteDrawer抽屉来存放,先上代码:
PaletteDrawer drawer = new PaletteDrawer("模型");
// 模型工具所对应的图标
ImageDescriptor descriptor = AbstractUIPlugin
.imageDescriptorFromPlugin(Activator.PLUGIN_ID,
IDmImageKey.START_IMAGE);
ImageDescriptor s_descriptor = AbstractUIPlugin
.imageDescriptorFromPlugin(Activator.PLUGIN_ID,
IDmImageKey.S_START_IMAGE);
// 创建“开 始”工具
CreationToolEntry startToolEntry = new CreationToolEntry(
"开始" , "创建开始图元", new SimpleFactory(
StartModel.class), s_descriptor, descriptor);
drawer.add(startToolEntry);
root.add(drawer);
效果如下图:
有人会问,如果要添加多级文件夹来分类存放绘图工具,那该怎么办呢?
默认的PaletteDrawer类是不行的,也就是说PaletteDrawer下不能再包含多个PaletteDrawer,虽然PaletteGroup 下能包含PaletteGroup 和PaletteDrawer,但由于其不能展开和收缩子节点,而且没有标题,所有要了也没用。
看下PaletteDrawer的源代码,我们马上发现他不能包含PaletteDrawer的原因了:
/**
- Returns true if this type can be a child of this Container
- @param type
the type being requested
- @return true if this can be a child of this container
*/
public boolean acceptsType(Object type) {
if (type.equals(PALETTE_TYPE_DRAWER)
|| type.equals(PaletteGroup.PALETTE_TYPE_GROUP))
return false;
return super.acceptsType(type);
}
这是PaletteDrawer类覆盖其父类PaletteContainer的一个方法,type.equals(PALETTE_TYPE_DRAWER) || type.equals(PaletteGroup.PALETTE_TYPE_GROUP))表明如果用户往其下添加的是PaletteDrawer或PaletteGroup ,就不接受,于是,我们只要自定义一个类,继承PaletteDrawer,覆盖掉这方法,就可以做成多级树了!给一个实现:
public class MyPaletteDrawer extends PaletteDrawer {
public MyPaletteDrawer(String label) {
super(label);
}
public MyPaletteDrawer(String label, ImageDescriptor icon) {
super(label, icon);
}
public boolean acceptsType(Object type) {
// 这里强迫接受PaletteDrawer和PaletteGroup
if (type.equals(PALETTE_TYPE_DRAWER)
|| type.equals(PaletteGroup.PALETTE_TYPE_GROUP))
return true;
return super.acceptsType(type);
}
}
这样以后,你就可以在 MyPaletteDrawer下用add方法添加多个MyPaletteDrawer对象了,就可以做成多级树来存放工具了!
效果图:
注意,由于这样做的话,没有传统树级结构的缩进,所以我在子MyPaletteDrawer对象中用了
public MyPaletteDrawer(String label, ImageDescriptor icon) {
super(label, icon);
}
转载于:https://www.cnblogs.com/zhjj/p/7086002.html
GEF调色板中的多级树结构相关推荐
- #自定义多级菜单_怎么搞定排版中的多级列表问题?
很多将近毕业的大学生都在赶着毕业论文,但是有很多小伙伴在论文排版中那个多级列表却搞不定,再网上看的教程看似很简单但在实际操作起来却很乱,那我们应该怎么样高效的去设置多级列表呢,最近小编学到了一个好方法 ...
- a标签不可点击_如何在Notion中做多级标签?-Notion102
Notion102的意思是:比101(入门级)高出一点点,但操作上仍属于新手级别. 模板链接见最下方. Notion 最新重要更新 @ 20.11.11 Timeline (数据库中增加了时间线视图. ...
- IDEA 中创建多级目录
IDEA 中创建多级目录 1.问题描述 之前跟着网上的教程搭建 Mybatis 快速入门的小 Demo,进行单元测试时居然抛异常了:Cause: java.io.IOException: Could ...
- html分级显示的下拉列表,javascript实现在下拉列表中显示多级树形菜单的方法
本文实例讲述了javascript实现在下拉列表中显示多级树形菜单的方法.分享给大家供大家参考.具体如下: 这里演示在下拉列表框中显示分级的菜单,在很多网站都可以看到的效果,很实用,下拉列表框中的选项 ...
- JS 中引号多级嵌套
2019独角兽企业重金招聘Python工程师标准>>> js中引号多级嵌套: 1.第一级 "" : 2.第二级 '' : 3.第三级\" \& ...
- 聊聊微服务架构中的多级缓存设计
大家好,我是不才陈某~ 今天我们来聊聊缓存这个话题,看看在微服务环境下如何设计有效的多级缓存架构.主要涉及三方面内容: Web 应用的客户端缓存: 应用层静态资源缓存: 服务层多级缓存. 首先,咱们先 ...
- WORD中的多级列表详解
基础篇: WORD中的项目符号实例详解 WORD中的自动编号实例详解 有了上面的基础,再来理解WORD中的多级列表就容易多了. 多级列表菜单 开始-段落:多级列表下拉菜单,其中的主要内容跟" ...
- html如何设置多级列表,如何在Word文档中设置多级列表
懂得Word文档中设置多级列表,可以使文档中的文字字体美观大方,一定程度上也提升了自己的文档水平.以下是学习啦小编为您带来的关于Word文档中设置多级列表的方法,希望对您有所帮助. Word文档中设置 ...
- 计算机应用的多级列表是什么,Word2019中应用多级列表并更改级别的方法
为Word文档中指定内容应用多级列表的方法比较简单,只需在选中指定文本段落后再选择多级列表样式即可.若要调整级别,则需要利用"更改列表级别"选项来实现.本文图文详解Word2019 ...
最新文章
- iOS 有用的代码片段
- [转]parseUrl函数
- JZOJ 3769. 【NOI2015模拟8.14】A+B
- rate limiter - system design
- 信息检索IR评价中常见的评价指标-MAP\NDCG\ERR\P@10等
- java aes pbe_JAVA对称加密算法PBE定义与用法实例分析
- MySQL存储过程中的循环怎么写
- python数据分析与挖掘实战pdf_《Python数据分析与挖掘实战》PDF+完整源码
- Java 面试——字符串操作、值传递、重载与重写
- linux设置合上电脑,CentOS7设置笔记本合盖不休眠
- c语言求数组中绝对值最小值,整数数组中两两之差绝对值最小的值
- perl(Time::HiRes) is needed mysql5.7
- Ceph添加OSD节点
- java代码:双色球号随机生成(极其简洁!)
- 获取摄像头视频流,进行人脸识别(支持单人脸识别、车牌识别)
- 线性代数笔记(线性方程组、线性空间,线性变换)
- linux 查看声卡设备并测试录音 (ALSA 音频工具)
- 赵哲焕 Clock work RNN(CW-RNN)
- 自强学堂 java_Java File类 - Java 教程 - 自强学堂
- Css之scoped (有作用域的 CSS)