GEF原理及实现系列(八、选项板)

本文介绍了GEF框架中选项板(PaletteRoot)的功能与实现方式,包括如何通过添加模型选项入口项(ToolEntry)和模型分组项(PaletteDrawer)来创建模型入口。
选项板提供了用户选择模型元素,并提供相应的机制把模型和视图加入图形编辑器的能力。
1.选项板(PaletteRoot)的功能
    GEF是一个图形编辑框架,它的主编辑区域是一个图形的视图(类似与JFace的Viewer),另外,用户还可以选择选项板上相应的模型,把选择的模型对应的视图加入到图形编辑区域进行编辑。
    在GEF中,图形编辑器实现类的getPaletteRoot方法将返回一个PaletteRoot对象,用户可以在PaletteRoot中添加模型选 项入口项(ToolEntry)。例如,在选择板中加入一个连线模型的入口,可以加入“new ConnectionCreationToolEntry("连线", "Create a connection", null, null, null);”,ToolEntry的参数描述了选项板中选项的显示标签、显示图标、提示信息、模型的模板类及模型的创建工厂类等信息。
2.选项板的实现
    在选项板中创建模型的入口,能添加模型的选择项(ToolEntry)和模型分组项(PaletteDrawer),代码如下:
java 代码
 
  1. package com.example.tools;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import org.eclipse.gef.palette.CombinedTemplateCreationEntry;  
  7. import org.eclipse.gef.palette.ConnectionCreationToolEntry;  
  8. import org.eclipse.gef.palette.PaletteContainer;  
  9. import org.eclipse.gef.palette.PaletteDrawer;  
  10. import org.eclipse.gef.palette.PaletteGroup;  
  11. import org.eclipse.gef.palette.PaletteRoot;  
  12. import org.eclipse.gef.palette.SelectionToolEntry;  
  13. import org.eclipse.gef.palette.ToolEntry;  
  14. import org.eclipse.gef.requests.SimpleFactory;  
  15.   
  16. import com.example.model.Node;  
  17.   
  18. public class PaletteFactory {  
  19.     public static PaletteRoot createPalette() {  
  20.         //新建选项板  
  21.         PaletteRoot paletteRoot = new PaletteRoot();  
  22.         //添加选项板中的模型选项  
  23.         paletteRoot.addAll(createCategories(paletteRoot));  
  24.         return paletteRoot;  
  25.     }  
  26.   
  27.     private static List createCategories(PaletteRoot root) {  
  28.         List categories = new ArrayList();  
  29.         //添加分组选项  
  30.         categories.add(createControlGroup(root));  
  31.         categories.add(createComponentsDrawer());  
  32.   
  33.         return categories;  
  34.     }  
  35.   
  36.     private static PaletteContainer createControlGroup(PaletteRoot root) {  
  37.         PaletteGroup controlGroup = new PaletteGroup("Control Group");  
  38.   
  39.         List entries = new ArrayList();  
  40.         //添加取消模型选择项  
  41.         ToolEntry tool = new SelectionToolEntry();  
  42.         entries.add(tool);  
  43.         //设置SelectionToolEntry为默认选项  
  44.         root.setDefaultEntry(tool);  
  45.         //添加连线模型选项入口  
  46.         tool = new ConnectionCreationToolEntry("连线""Create a connection"nullnullnull);  
  47.         entries.add(tool);  
  48.   
  49.         controlGroup.addAll(entries);  
  50.         return controlGroup;  
  51.     }  
  52.   
  53.     private static PaletteContainer createComponentsDrawer() {  
  54.         //添加组件分组页  
  55.         PaletteDrawer drawer = new PaletteDrawer("Components");  
  56.   
  57.         List entries = new ArrayList();  
  58.         //添加Node模型选项入口  
  59.         ToolEntry tool = new CombinedTemplateCreationEntry("节点""创建一个节点", Node.classnew SimpleFactory(  
  60.                 Node.class), nullnull);  
  61.         entries.add(tool);  
  62.   
  63.         drawer.addAll(entries);  
  64.         return drawer;  
  65.     }  
  66. }  

上面代码加入了连线模型、分组项、取消选择项和一个节点项(Node模型)。建立的选项板如下图:

小结:
    最近由于项目需要,开始学习GEF。首先感谢八进制,我就是照着他写的GEF入门系列,再配合书本学习的。感觉GEF是很完善的图形编辑框架,能够用它构 造出功能非常强大的图形编辑器,但同时GEF还是比较复杂的,特别是对于没有接触过的初学者来说,很有可能里面的类都不知道是干什么的,更不了解类中的方 法;即使从字面上知道了类的作用,具体自己写的时候又不知道如何下手,本人也遇到了这些问题。我想先把GEF的原理搞清楚,再来细看里面的细节可能要好一 些。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值