[Eclipse]GEF入门系列(六、添加菜单和工具条)

我发现一旦稍稍体会到GEF的妙处,就会很自然的被它吸引住。不仅是因为用它做出的图 形界面好看,更重要的是,UI中最复杂和细微的问题,在GEF的设计中无不被周到的考虑并以 适当的模式解决,当你了解了这些,完全可以把这些解决方法加以转换,用来解决其他领域 的设计问题。去年黄老大在一个GEF项目结束后,仍然没有放弃对它的继续研究,现在甚至利 用业余时间开发了基于GEF的SWT/JFace增强软件包,Eclipse和GEF的魅力可见一斑。我相信 在未来的两年里,由于RCP/GEF等技术的成熟,Java Standalone应用程序必将有所发展,在 B/S模式难以实现的那部分领域里扮演重要的角色。

本篇的主题是实现菜单功能,由于Eclipse的可扩展设计,在GEF应用程序中添加菜单要多 几处考虑,所以我首先介绍Eclipse里关于菜单的一些概念,然后再通过实例描述如何在GEF 里添加菜单、工具条和上下文菜单。

我们知道,Eclipse本身只是一个平台(Platform),用户并不能直接用它来工作,它的 作用是为那些提供实际功能的部件提供一个基础环境,所有部件都通过平台指定的方式构造 界面和使用资源。在Eclipse里,这些部件被称为插件(Plugins),例如Java开发环境(JDT )、Ant支持、CVS客户端和帮助系统等等都是插件,由于我们从eclipse.org下载的Eclipse 本身已经包含了这些常用插件,所以不需要额外的安装,就好象Windows本身已经包含了记事 本、画图等等工具一样。如果我们需要新功能,就要通过下载安装或在线更新的方式把它们 安装到Eclipse平台上,常见的如XML编辑器、Properties文件编辑器,J2EE开发支持等等, 包括GEF开发包也是这类插件。插件一般都安装在Eclipse安装目录的plugins子目录下,也可 以使用link方式安装在其他位置。

Eclipse平台的一个优秀之处在于,如此众多的插件能够完美的集成在同一个环境中,要 知道,每个插件都可能具有编辑器、视图、菜单、工具条、文件关联等等复杂元素,要让它 们能够和平共处可不是件容易事。为此,Eclipse提供了一系列机制来解决由此带来的各种问 题。由于篇幅限制,这里只能简单讲一下菜单和工具条的部分,更多内容请参考Eclipse随机 提供的插件开发帮助文档。

大多数情况下,我们说开发一个基于Eclipse的应用程序就是指开发一个Eclipse插件 (plugin),Eclipse里的每个插件都有一个名为plugin.xml的文件用来定义插件里的各种元 素,例如这个插件都有哪些编辑器,哪些视图等等。在视图中使用菜单和工具条请参考以前 的贴子,本篇只介绍编辑器的情况,因为GEF应用程序大多数是基于编辑器的。

图1 Eclipse平台的几个组成部分

首先要介绍Retarget Action的概念,这是一种具有一定语义但没有实际功能的Action, 它唯一的作用就是在主菜单条或主工具条上占据一个项位置,编辑器可以将具有实际功能的 Action映射到某个Retarget Action,当这个编辑器被激活时,主菜单/工具条上的那个 Retarget Action就会具有那个Action的功能。举例来说,Eclipse提供了 IWorkbenchActionConstants.COPY这个Retarget Action,它的文字和图标都是预先定义好的 ,假设我们的编辑器需要一个"复制节点到剪贴板"功能,因为"复制节点"和"复制"这两个词 的语义十分相近,所以可以新建一个具有实际功能的CopyNodeAction(extends Action), 然后在适当的位置调用下面代码实现二者的映射:

IActionBars.setGlobalActionHandler(IWorkbenchActionConstants.COPY, copyNodeAction)

当这个编辑器被激活时,Eclipse会检查到这个映射,让COPY项变为可用状态,并且当用 户按下它时去执行CopyNodeAction里定义的操作,即run()方法里的代码。Eclipse引入 Retarget Action的目的是为了尽量减少主菜单/工具条的重建消耗,并且有利于用户使用上 的一致性。在GEF应用程序里,因为很可能存在多个视图(例如编辑视图和大纲视图,即使暂 时只有一个视图,也要考虑到以后扩展为多个的可能),而每个视图都应该能够完成相类似 的操作,例如在树结构的大纲视图里也应该像编辑视图一样可以删除选中节点,所以一般的 操作都应以映射到Retarget Action的方式建立。

时间: 2024-09-16 04:02:41

[Eclipse]GEF入门系列(六、添加菜单和工具条)的相关文章

[Eclipse]GEF入门系列(九、增加易用性)

当一个GEF应用程序实现了大部分必需的业务功能后,为了能让用户使用得更方便,我们 应该在易用性方面做些考虑.从3.0版本开始, GEF增加了更多这方面的新特性,开发人员很 容易利用它们来改善自己的应用程序界面.这篇帖子将介绍主要的几个功能,它们有些在GEF 2.1中就出现了,但因为都是关于易用性的而且以前没有提到,所以放在这里一起来说. 可折叠调色板 在以前的例子里,我们的编辑器都继承自GraphicalEditorWithPalette.GEF 3.0提供了 一个功能更加丰富的编辑器父类:Gr

[Eclipse]GEF入门系列(二、GEF概述)

在前面的帖子已经提到,GEF(Graphical Editor Framework)是一个图形化编辑框架, 它允许开发人员以图形化的方式展示和编辑模型,从而提升用户体验.这样的应用程序有很 多,例如:UML类图编辑器.图形化XML编辑器.界面设计工具以及图形化数据库结构设计工 具等等.归结一下,可以发现它们在图形化编辑方面具有以下共同之处: 提供一个编辑区域和一个工具条,用户在工具条里选择需要的工具,以拖动或单击的方式 将节点或连接放置在编辑区域: 节点可以包含子节点: 用户能够查看和修改某个节

[Eclipse]GEF入门系列(一、Draw2D)

关于Java2D相信大家都不会陌生,它是基于AWT/Swing的二维图形处理包, JDK附带的示 例程序向我们展示了Java2D十分强大的图形处理能力.在Draw2D出现以前,SWT应用程序在这 方面一直处于下风,而Draw2D这个SWT世界里的Java2D改变了这种形势. 可能很多人还不十分了解GEF和Draw2D的关系:一些应用程序是只使用Draw2D,看起来却 和GEF应用程序具有相似的外观.原因是什么,下面先简单解释一下: GEF是具有标准MVC(Model-View-Control)结

[Eclipse]GEF入门系列(序)

由于工作的需要,最近开始研究GEF(Graphical Editor Framework)这个框架,它可以 用来给用户提供图形化编辑模型的功能,从而提升用户体验,典型的应用如图形化的流程设 计器.UML类图编辑器等等.其实一年多来我们做的项目都是和它有关的,只是之前我具体负 责的事情和它没什么关系.那时也看过黄老大写的代码,EMF和GEF混在一起特别晕,没能坚 持看下去.这次自己要动手做了,正好趁此机会把它搞明白,感觉GEF做出来的东西给人很专 业的感觉,功能也很强大,应该挺有前途的.此外,GE

[Eclipse]GEF入门系列(十二、自定义Request)

先简单回顾一下Request在GEF里的作用.Request是GEF里一个比较重要的角色,Tool将原 始的鼠标事件转换为EditPart可以识别的请求,Request则承载了这些请求信息.举例来说, 用户在调色板(Palette)里选择了创建节点工具(CreationTool),然后在画布区域按下鼠 标左键,这时产生在画布上的鼠标单击事件将被CreationTool转换为一个CreateRequest,它 里面包含了要创建的对象,坐标位置等信息. EditPart上如果安装了能够处理 Crea

[Eclipse]GEF入门系列(十一、树的一个实现)

两天前GEF发布了3.1M7版本,但使用下来发现和M6没有什么区别,是不是主要为了和 Eclipse版本相配套?希望3.1正式版早日发布,应该会新增不少内容.上一篇帖子介绍了如 何实现表格功能,在开发过程中,另一个经常用到的功能就是树,虽然SWT提供了标准的树控 件,但使用它完成如组织结构图这样的应用还是不够直观和方便.在目前版本(3.1M7)的 GEF中虽然没有直接支持树的实现,但Draw2D提供的例子程序里却有我们可以利用的代码 (org.eclipse.draw2d.examples.tr

[Eclipse]GEF入门系列(八、使用EMF构造GEF的模型)

GEF的设计没有对模型部分做任何限制,也就是说,我们可以任意构造自己的模型,唯一 须要保证的就是模型具有某种消息机制,以便在发生变化时能够通知GEF(通过EditPart). 在以前的几个例子里,我们都是利用java.beans包中的PropertyChangeSupport和 PropertyChangeListener来实现消息机制的,这里将介绍一下如何让GEF利用EMF构造的模 型. EMF使用自己定义的Ecore作为元模型,在这个元模型里定义了EPackage.EClassifier.

[Eclipse]GEF入门系列(四、其他功能)

最近由于实验室任务繁重,一直没有继续研究GEF,本来已经掌握的一些东西好象又丢掉 了不少,真是无奈啊,看来还是要经常碰碰.刚刚接触GEF的朋友大都会有这样的印象:GEF 里概念太多,比较绕,一些能直接实现的功能非要拐几个弯到另一个类里做,而且很多类的 名字十分相似,加上不知道他们的作用,感觉就好象一团乱麻.我觉得这种情况是由图形用 户界面(GUI)的复杂性所决定的,GUI看似简单,实际上包含了相当多的逻辑,特别是GEF处 理的这种图形编辑方式,可以说是最复杂的一种.GEF里每一个类,应该说都有它

[Eclipse]GEF入门系列(三、应用实例)

构造一个GEF应用程序通常分为这么几个步骤:设计模型.设计EditPart和Figure.设计 EditPolicy和Command,其中 EditPart是最主要的一部分,因为在实现它的时候不可避免的 要使用到EditPolicy,而后者又涉及到Command. 现在我们来看个例子,它的功能非常简单,用户可以在画布上增加节点(Node)和节点间 的连接,可以直接编辑节点的名称以及改变节点的位置,用户可以撤消/重做任何操作,有一 个树状的大纲视图和一个属性页.这是一个Eclipse的项目打包文件