`
manzhizhen
  • 浏览: 293343 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

GEF调色板中的多级树结构

    博客分类:
  • 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);
 }
这个构造方法来换了一个不同的而且窄一点的图标,来制造缩进效果,先凑合用吧,以后大家有好的方法可以相互交流哦!

  • 大小: 5.1 KB
  • 大小: 2.8 KB
  • 大小: 13.4 KB
分享到:
评论

相关推荐

    GEF 入门版中文教程 源码

    在GEF中,模型通常由EMF(Eclipse Modeling Framework)来定义和管理,可以将业务逻辑和视图分离。 2. **视图(View)**:视图是模型的可视化表示,它将模型数据呈现为用户界面。GEF提供了基础框架来实现这一转换,...

    IBM GEF 推广资料

    7. **调色板视图**:提供图形元素的选择和插入界面,帮助用户快速创建和编辑图形。 通过这个深入的教程,参与者不仅可以学习到GEF的基本用法,还能了解如何在实际项目中规划和应用GEF,从而提升开发高效图形编辑...

    GEF中文教程+代码

    在本教程中,我们将深入探讨GEF的基本概念、设计原则以及如何使用它来开发自己的图形编辑器。 **1. GEF简介** GEF的设计目标是将图形编辑器的实现细节抽象化,让开发者能够专注于业务逻辑和模型设计,而不是底层的...

    自己下的GEF资源打包

    标题中的“GEF资源打包”指的是一个集合了关于GEF(Graph Edit Framework)的各种学习资料的压缩文件。这个资源包可能包含了对理解、学习和使用GEF非常有帮助的材料。描述进一步说明了这个包中包含的具体内容,如...

    GEF-SDK-3.6.2 jar

    4. **连接器和容器**:GEF提供了处理图形元素之间连接以及包含关系的机制,如树形结构、网格布局等。 5. **自动生成代码**:通过GEF,开发者可以定义图形化的编辑域,然后自动生成对应的Java代码,减少了手动编码的...

    GEF Example Source Code

    描述中的"GEF Example Source Code"进一步强调了这是一个专注于GEF实际应用的代码资源,可能是为了教学目的或帮助开发者快速上手。通过查看和分析这些示例代码,开发者可以学习到如何处理图形绘制、交互操作、模型...

    GEF入门实例代码2《Eclipse插件开发》中实例

    此外,理解MVC(模型-视图-控制器)模式和MVC在GEF中的应用对于提升开发效率至关重要。 总之,通过这个"GEF入门实例代码2",开发者可以了解到如何在Eclipse中构建一个基于GEF的图形编辑器,这不仅涉及数据模型的...

    GEF快速入门教程和EMF教程

    - **Draw2D**: 版本3.1.0或以上,通常包含在GEF中 - **EMF**: 版本2.1.0或以上 ### 创建RCP项目 1. **初始化项目**: - 打开Eclipse并选择“File” > “New” > “Other” > “Plug-in Project”。 - 为项目命名`...

    GEF入门学习例子

    在GEF中,模型通常由`EObject`和`EObjectImpl`实现,可以使用EMF(Eclipse Modeling Framework)来生成。 2. **视图(View)**: 视图是模型的可视化表示,将模型数据呈现给用户。GEF中的视图由`GraphicalViewer`类...

    GEF入门必读 GEF入门系列 GEF-whole-upload

    **GEF(Graphical Editing Framework)** 是一个用于构建图形化编辑器的...对于希望在Java和Eclipse环境中提升图形界面开发技能的程序员来说,"GEF入门必读 GEF入门系列 GEF-whole-upload"是一个不可多得的学习资源。

    GEF简易教程-学习GEF的入门教程

    在RCP项目中,**Editor**是最常见的GEF承载对象,它继承自`EditorPart`,提供了图形修改后的自动保存机制,这是View不具备的功能。 为了构建GEF编辑器,需要创建以下三个核心组件: 1. **模型(Model)**:定义数据...

    GEF-SDK-3.3.1.zip

    GEF提供了构建可视化编辑器的框架,使得开发者能够快速地开发出具有拖放、连接线、层次结构等图形交互功能的应用程序。 标题中的"GEF-SDK-3.3.1.zip"指的是GEF的软件开发工具包(SDK)的3.3.1版本,这是一个压缩包...

    gef 转折线的相关方法实现和 GEF的API chm 格式

    在gef中,转折线的实现涉及到PathFigure和Segment类的使用。PathFigure用于定义一个图形的轮廓,而Segment则代表了轮廓中的一段线段。通过添加和调整Segment实例,我们可以构建出具有转折点的线条。 实现gef转折线...

    Eclipse开发使用GEF和EMF(IBM 红皮书)中英文对照版

    《Eclipse开发使用GEF和EMF》是IBM红皮书系列中的一部经典著作,主要探讨了如何在Eclipse环境中利用GEF(图形编辑框架)和EMF( Eclipse模型框架)进行图形化应用程序的开发。这两项技术是Eclipse平台上的核心组件,...

    Eclipse的GEF学习

    在GEF中,模型需具备变化通知机制,以便于及时更新控制器和视图。通常,模型的设计应紧密贴合业务逻辑,以确保数据的准确性和完整性。 2. **控制器(Control)**:控制器,即EditPart,是GEF的核心部件,负责处理模型...

    GEF-SDK-3.7.0

    **GEF(Graphical Editing Framework)** 是一个用于构建图形化编辑器的开源框架,它在Eclipse平台中被广泛使用。**GEF-SDK-3.7.0** 是这个框架的一个特定版本,提供了开发人员构建图形用户界面(GUI)和可视化编辑...

    GEF-Update-3.7.1.zip

    在Eclipse插件开发中,它可能用于帮助Eclipse的插件管理系统理解GEF的依赖结构,以便正确地安装和运行插件。 3. **site.xml**:这是一个站点描述文件,用于定义Eclipse更新站点的结构和内容。在这个文件中,可以...

    GEF_Demo_Code20170307

    这个项目旨在演示如何利用GEF进行图形界面开发,并且特别关注了通过适配器(Adapter)扩展点来实现属性页配置以及在非Editor的ViewPart中使用GEF。 GEF是Eclipse平台下的一个开源库,专门用于构建可自定义的、图形...

    GEF实现拷贝粘贴

    在GEF中,模型通常是Eclipse的EMF(Eclipse Modeling Framework)模型对象,视图由Part类表示,控制器则是EditPolicy。 实现拷贝粘贴功能在GEF中涉及到以下几个关键步骤: 1. **定义CopyCommand和PasteCommand**:...

Global site tag (gtag.js) - Google Analytics