在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调色板中的多级树结构相关推荐

  1. #自定义多级菜单_怎么搞定排版中的多级列表问题?

    很多将近毕业的大学生都在赶着毕业论文,但是有很多小伙伴在论文排版中那个多级列表却搞不定,再网上看的教程看似很简单但在实际操作起来却很乱,那我们应该怎么样高效的去设置多级列表呢,最近小编学到了一个好方法 ...

  2. a标签不可点击_如何在Notion中做多级标签?-Notion102

    Notion102的意思是:比101(入门级)高出一点点,但操作上仍属于新手级别. 模板链接见最下方. Notion 最新重要更新 @ 20.11.11 Timeline (数据库中增加了时间线视图. ...

  3. IDEA 中创建多级目录

    IDEA 中创建多级目录 1.问题描述 之前跟着网上的教程搭建 Mybatis 快速入门的小 Demo,进行单元测试时居然抛异常了:Cause: java.io.IOException: Could ...

  4. html分级显示的下拉列表,javascript实现在下拉列表中显示多级树形菜单的方法

    本文实例讲述了javascript实现在下拉列表中显示多级树形菜单的方法.分享给大家供大家参考.具体如下: 这里演示在下拉列表框中显示分级的菜单,在很多网站都可以看到的效果,很实用,下拉列表框中的选项 ...

  5. JS 中引号多级嵌套

    2019独角兽企业重金招聘Python工程师标准>>> js中引号多级嵌套: 1.第一级 "" :     2.第二级 '' : 3.第三级\"  \& ...

  6. 聊聊微服务架构中的多级缓存设计

    大家好,我是不才陈某~ 今天我们来聊聊缓存这个话题,看看在微服务环境下如何设计有效的多级缓存架构.主要涉及三方面内容: Web 应用的客户端缓存: 应用层静态资源缓存: 服务层多级缓存. 首先,咱们先 ...

  7. WORD中的多级列表详解

    基础篇: WORD中的项目符号实例详解 WORD中的自动编号实例详解 有了上面的基础,再来理解WORD中的多级列表就容易多了. 多级列表菜单 开始-段落:多级列表下拉菜单,其中的主要内容跟" ...

  8. html如何设置多级列表,如何在Word文档中设置多级列表

    懂得Word文档中设置多级列表,可以使文档中的文字字体美观大方,一定程度上也提升了自己的文档水平.以下是学习啦小编为您带来的关于Word文档中设置多级列表的方法,希望对您有所帮助. Word文档中设置 ...

  9. 计算机应用的多级列表是什么,Word2019中应用多级列表并更改级别的方法

    为Word文档中指定内容应用多级列表的方法比较简单,只需在选中指定文本段落后再选择多级列表样式即可.若要调整级别,则需要利用"更改列表级别"选项来实现.本文图文详解Word2019 ...

最新文章

  1. iOS 有用的代码片段
  2. [转]parseUrl函数
  3. JZOJ 3769. 【NOI2015模拟8.14】A+B
  4. rate limiter - system design
  5. 信息检索IR评价中常见的评价指标-MAP\NDCG\ERR\P@10等
  6. java aes pbe_JAVA对称加密算法PBE定义与用法实例分析
  7. MySQL存储过程中的循环怎么写
  8. python数据分析与挖掘实战pdf_《Python数据分析与挖掘实战》PDF+完整源码
  9. Java 面试——字符串操作、值传递、重载与重写
  10. linux设置合上电脑,CentOS7设置笔记本合盖不休眠
  11. c语言求数组中绝对值最小值,整数数组中两两之差绝对值最小的值
  12. perl(Time::HiRes) is needed mysql5.7
  13. Ceph添加OSD节点
  14. java代码:双色球号随机生成(极其简洁!)
  15. 获取摄像头视频流,进行人脸识别(支持单人脸识别、车牌识别)
  16. 线性代数笔记(线性方程组、线性空间,线性变换)
  17. linux 查看声卡设备并测试录音 (ALSA 音频工具)
  18. 赵哲焕 Clock work RNN(CW-RNN)
  19. 自强学堂 java_Java File类 - Java 教程 - 自强学堂
  20. Css之scoped (有作用域的 CSS)

热门文章

  1. 常考数据结构与算法:最大正方形
  2. spring源码学习一
  3. oracle之TNS:无监听程序解决办法
  4. oracle, to_char(), to_number, ORA_01722
  5. MongoDB数据节点基础操作
  6. 【星云测试】开发者测试-采用精准测试工具对Spring Boot应用进行测试
  7. Android仿QQ侧滑菜单
  8. 开源性能测试工具JMeter快速入门(一)
  9. 图像纹理合成及纹理传输算法学习(附源码)。
  10. php 声明字符串的三种方式