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

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

在Eclipse里查看文档和代码相当便利,比如我们对某个类的用法不清楚,一般首先找它 的注释(选中类或方法按F2),其次可以查看它在其他地方用法(选中类或方法按 Ctrl+Shift+G),还可以找它的源代码(Ctrl+鼠标左键或F3)来看,另外Ctrl+Shift+T可以 按名称查找一个类等等。学GEF是少不了看代码的,当然还需要时间和耐心。

好,闲话少说,下面进入正题。这篇帖子将继续上一篇内容,主要讨论如何实现 DirectEdit、属性页和大纲视图,这些都是一个完整GEF应用程序需要提供的基本功能。

实现DirectEdit

所谓DirectEdit(也称In-Place-Edit),就是允许用户在原本显示内容的地方直接对内 容进行修改,例如在Windows资源管理器里选中一个文件,然后按F2键就可以开始修改文件名 。实现DirectEdit的原理很直接:当用户发出修改请求(REQ_DIRECT_EDIT)时,就在文字内 容所在位置覆盖一个文本框(也可以是下拉框,这里我们只讨论文本的情况)作为编辑器, 编辑结束后,再将编辑器中的内容应用到模型里即可。(作为类似的功能请参考:给表格的 单元格增加编辑功能)

图1 Direct Edit

在GEF里,这个弹出的编辑器由DirectEditManager类负责管理,在 我们的NodePart类里,通过覆盖performRequest()方法响应用户的DirectEdit请求,在这个 方法里一般要构造一个DirectEditManager类的实例(例子中的NodeDirectEditManager), 并传入必要的参数,包括接受请求的EditPart(就是自己,this)、编辑器类型(使用 TextCellEditor)以及用来定位编辑器的CellEditorLocator(NodeCellEditorLocator), 然后用show()方法使编辑器显示出来,而编辑器中显示的内容已经在构造方法里得到。简单 看一下NodeCellEditorLocator类,它的关键方法在relocate()里,当编辑器里的内容改变时 ,这个方法被调用从而让编辑器始终处于正确的坐标位置。DirectEditManager有一个重要的 initCellEditor()方法,它的主要作用是设置编辑器的初始值。在我们的例子里,初始值设 置为被编辑NodePart对应模型 (Node)的name属性值;这里还另外完成了设置编辑器字体和 选中全部文字(selectAll)的功能,因为这样更符合一般使用习惯。

在NodePart里 还要增加一个角色为DIRECT_EDIT_ROLE的EditPolicy,它应该继承自DirectEditPolicy,有 两个方法需要实现:getDirectEditCommand()和showCurrentEditValue(),虽然还未遇到过 ,但前者的作用你不应该感到陌生--在编辑结束时生成一个Command对象将修改结果作用到模 型;后者的目的是更新Figure中的显示,虽然我们的编辑器覆盖了Figure中的文本,似乎并 不需要管Figure的显示,但在编辑中时刻保持这两个文本的一致才不会出现"盖不住 "的情况,例如当编辑器里的文本较短时。

时间: 2024-11-05 06:26:15

[Eclipse]GEF入门系列(四、其他功能)的相关文章

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

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

[Eclipse]GEF入门系列(七、XYLayout和展开/折叠功能)

前面的帖子里曾说过如何使用布局,当时主要集中在ToolbarLayout和FlowLayout(统称 OrderedLayout),还有很多应用程序使用的是可以自由拖动子图形的布局,在GEF里称为 XYLayout,而且这样的应用多半会需要在图形之间建立一些连接线,比如下图所示的情景. 连接的出现在一定程度上增加了模型的复杂度,连接线的刷新也是GEF关注的一个问题,这里 就主要讨论这类应用的实现,并将特别讨论一下展开/折叠(expand/collapse)功能的实现 . 图1 使用XYLayou

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

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

[Eclipse]GEF入门系列(序)

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

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

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

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

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

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

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

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

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

[Eclipse]GEF入门系列(五、浅谈布局)

虽然很多GEF应用程序里都会用到连接(Connection),但也有一些应用是不需要用连接 来表达关系的,我们目前正在做的这个项目就是这样一个例子.在这类应用中,模型对象间 的关系主要通过图形的包含来表达,所以大多是一对多关系. 图1 不使用连接的GEF应用 先简单描述一下我们这个项目,该项目需要一个图形化的模型编辑器,主要功能是在一个 具有三行N列的表格中自由增加/删除节点,节点可在不同单元格间拖动,可以合并相邻节点 ,表格列可增减.拖动等等.由于SWT/Jface提供的表格很难实现这些功能,