关于Java2D相信大家都不会陌生,它是基于AWT/Swing的二维图形处理包, JDK附带的示 例程序向我们展示了Java2D十分强大的图形处理能力。在Draw2D出现以前,SWT应用程序在这 方面一直处于下风,而Draw2D这个SWT世界里的Java2D改变了这种形势。
可能很多人还不十分了解GEF和Draw2D的关系:一些应用程序是只使用Draw2D,看起来却 和GEF应用程序具有相似的外观。原因是什么,下面先简单解释一下:
GEF是具有标准MVC(Model-View-Control)结构的图形编辑框架,其中Model由我们自己 根据业务来设计,它要能够提供某种模型改变通知的机制,用来把Model的变化告诉Control 层;Control层由一些EditPart实现,EditPart是整个GEF的核心部件,关于EditPart的机制 和功能将在以后的帖子里介绍;而View层(大多数情况下)就是我们这里要说的Draw2D了, 其作用是把Model以图形化的方式表现给使用者。
虽然GEF可以使用任何图形包作为View层,但实际上GEF对Draw2D的依赖是很强的。举例来 说:虽然EditPart(org.eclipse.gef.EditPart)接口并不要求引入任何Draw2D的类,但我 们最常使用的AbstractGraphicalEditPart类的createFigure()方法就需要返回IFigure类型 。由于这个原因,在GEF的SDK中索性包含了Draw2D包就不奇怪了,同样道理,只有先了解 Draw2D才可能掌握GEF。
这样,对于一开始提出的问题可以总结如下:Draw2D是基于SWT的图形处理包,它适合用 作GEF的View层。如果一个应用仅需要显示图形,只用Draw2D就够了;若该应用的模型要求以 图形化的方式被编辑,那么最好使用GEF框架。
现在让我们来看看Draw2D里都有些什么,请看下图。
图1 Draw2D的结构
Draw2D通过被称为LightweightSystem(以下简称LWS)的部件与SWT中的某一个Canvas实 例相连,这个Canvas在Draw2D应用程序里一般是应用程序的Shell,在GEF应用程序里更多是 某个Editor的Control(createPartControl()方法中的参数),在界面上我们虽然看不到LWS 的存在,但其他所有能看到的图形都是放在它里面的,这些图形按父子包含关系形成一个树 状的层次结构。
LWS是Draw2D的核心部件,它包含三个主要组成部分:RootFigure是LWS中所有图形的根, 也就是说其他图形都是直接或间接放在RootFigure里的;EventDispatcher把Canvas上的各种 事件分派给RootFigure,这些事件最终会被分派给适当的图形,请注意这个RootFigure和你 应用程序中最顶层的IFigure不是同一个对象,前者是看不见的被LWS内部使用的,而后者通 常会是一个可见的画布,它是直接放在前者中的;UpdateManager用来重绘图形,当Canvas被 要求重绘时,LWS会调用它的performUpdate()方法。