快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门24小时在线娱乐的网站:EclipseGEF入门系列(一、Draw2D)



关于Java2D信托大年夜家都不会陌生,它是基于AWT/Swing的二维图形处置惩罚包, JDK附带的示例法度榜样向我们展示了Java2D十分强澳门24小时在线娱乐的网站大年夜的图形处置惩罚能力。在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()措施。

LWS是连接SWT和Draw2D的桥梁,使用它,我们不仅可以轻松创建随意率性外形的图形(不仅仅限于矩形),同时能够节省系统资本(由于是轻量级组件)。一个范例的纯Draw2D利用法度榜样代码具有类似下面的布局:

//创建SWT的Canvas(Shell是澳门24小时在线娱乐的网站Canvas的子类)

Shell shell = new Shell();

shell.open();

shell.setText("A Draw2d application");

//创建LightweightSystem,放在shell上

LightweightSystem lws = new LightweightSystem(shell);

//创建利用法度榜样中的最顶层图形

IFigure panel = new Figure();

panel.setLayoutManager(new FlowLayout());

//把这个图形放置于LightweightSystem的RootFigure里

lws.setContents(panel);

//创建利用法度榜样中的其他图形,并放置于利用法度榜样的顶层图形中

panel.add();

while (!shell.isDisposed ()) {

if (!display.readAndDispatch ())

display.sleep ();

}

图形化利用法度榜样的一个常见义务便是在两个图形之间做连接,想象一下UML类图中的各类连接线,或者法度榜样流程图中表示数据流的线条,它们有着不合的外不雅,有些连接线还要显示名称,而且最好能不交叉。使用Draw2D中的Router、Anchor和Locator,可以实现多种连接样式,此中Router认真连接线的外不雅和操作要领,最简单的是设置Router为null(无Router),这样会应用直线连接,其他连接要领包括折线、具有节制点的折线等等(见图3),若想节制连接线不相互交叉也必要在Router中作文章。Anchor节制连接线端点在图形上的位置,即"锚点"的位置,最易于应用的是ChopBoxAnchor,它先假设图形中间为连接点,然后谋略这条假想连线与图形边缘的交汇点作为实际的锚点,澳门24小时在线娱乐的网站其他Anchor还有EllipseAnchor、LabelAnchor和XYAnchor等等;着末,Locator的感化是定位图形,例如盼望在连接线中点处以一个标签显示此连线的名称/感化,就可以应用MidpointLocator来赞助定位这个标签,其他Locator还有ArrowLocat澳门24小时在线娱乐的网站or用于定位可扭转的修饰(Decoration,例如Polygon澳门24小时在线娱乐的网站Decoration)、BendpointerLocator用于定位连接节制点、ConnectionEndpointLocator用于定位连接端点(经由过程指定uDistance和vDistance属性的值可以设置以端点为原点的坐标)。

图3 三种Router的外不雅

此外,Draw2D在org.eclipse.draw2d.geometry包里供给了几个很方便的类型,如Dimension、Rectangle、Insets、Point和PointList等等,这些类型既在Draw2D内部广泛应用,也可以被开拓职员用来简化谋略。例如Rectangle表示的是一个矩形区域,它供给getIntersection()措施能够方便的谋略该区域与另一矩形区域的重叠区域、getTransposed()措施可以获得长宽值互换后的矩形区域、scale()措施进行矩形的拉伸等等。在自己实现LayoutManager的时刻,因为会涉及到对照繁杂的几何谋略,以是更保举应用这些类。

以上先容了Draw2D供给的大年夜部分功能,使用这些我们已经能够画出十分漂亮的图形了。但对大年夜多半实际利用来说这样还远远不敷,我们还要能编辑它,并把对图形的改动反应到模型里去。为了漂亮的完成这个艰难义务,GEF绝对是不二之选。从下一次开始,我们将正式进入GEF的天下。

您可能还会对下面的文章感兴趣: