GEF 进阶,第三部分: Layer
来源:互联网 发布:php用逗号拼接字符串 编辑:程序博客网 时间:2024/06/13 18:59
简介: 在GEF中,画板是由多个Layer(层)组成的,层也可以看作是对图形进行的一种分类管理,它使图形更加明确,层次清晰。程序结构上也更容易理解和维护。层同样也是可以定制的,本文演示如何实现并插入一个自定义层,并指出了插入自定义层所应该注意的一些问题。
Layer(层)
GEF的图形是可能分布在多个层上面的,比如连线是放在Connection Layer(连接层)上的,而普通的图形(比如Shapes Example里面的长方形和椭圆)是放置在Primary Layer(主层)上的。不同类型的图形放置在不同的层上,既易于管理又结构清晰,因此层是一个非要重要的功能。层其实也是一个图形,和其他图形一样都继承自Figure类,所以我们也可以象添加普通图形一样添加层,只不过方式有点不同而已。
我们首先需要知道层是在哪里创建的,才好动手修改它们。在GEF中,每一个EditPart Viewer都有一个特殊的EditPart,叫做Root,而层的创建就在其中。因此要添加自定义的层,首先的任务就是扩展Root EditPart,一般来说,我们使用的是ScalableFreeformRootEditPart。
提示: 使用何种Root EditPart也是可以自己控制的,只需要在重载GraphicalEditor的configureGraphicalViewer方法,指定使用我们自己的Root EditPart即可。以下是一段示例代码,斜黑体部分就是具体的调用:
protected void configureGraphicalViewer() {super.configureGraphicalViewer();GraphicalViewer viewer = getGraphicalViewer();viewer.setRootEditPart(new ScalableFreeformRootEditPart());// more code……………}
所以,这是我们能够自定义层的一个前提。
ScalableFreeformRootEditPart的createLayers()方法是创建层的关键所在,仔细观察其实现,不难看出GEF缺省定义了如图1所示的层次结构:
提示: 先添加的层在下,后添加的层在上
我们看到缺省包含了很多层,而且层中还有子层,每个层都有一个关键字来标识,我们从下到上做一个简要的描述:
- Grid Layer: 网格层,用来显示一个网格,帮助你定位图形
- Primary Layer: 主层,大部分的图形都放置在这个层
- Connection Layer: 连接层,连线都放置在这一层
- Printable Layer: 可打印层,这个层并没有实际作用,只是用来包含主层和连接层
- Scaled Feedback Layer: 扩展反馈层,所谓反馈是指操作时显示的一些提示信息,比如你拖动一个图形时,会显示一个虚影,这就是反馈
- Scalable Layer: 和Printable Layer一样,只是一个容器层
- Handle Layer: Handle是指一些可以拖动的小方块,比如选择一个图形时,会显示八个用于Resize的Handle
- Feedback Layer: 也是一个反馈层
- Guide Layer: 帮助层
所有的层我们都可以通过getLayer()方法得到,因此我们有很大的自由去控制这些层的属性,但是如果我们要添加一个层或者修改一个层的行为,我们必须实现自己的RootEditPart。
Background Layer (背景层)
出于演示的目的,我们添加一个比较简单的层,叫做Background Layer,它的用处就是在画布上显示一个渐进的背景,我们把这个层添加到Primary Layer之前,避免覆盖主层上的图形。
注意,我们添加的这个层只是出于演示目的,实际上添加一个背景色并不用费此周章。我们只是为了说明如何添加一个自定义的层。
创建BackgroundLayer类
我们首先来创建类,对于层,我们只要继承Layer类就可以了,而Layer本身继承自Figure,它没有添加任何新的方法,如果你扩展过Figure类的话,对此就应该比较熟悉了。由于我们只是画个渐进背景色,所以只需要重载一下paintFigure方法就可以了。如下
package org.eclipse.gef.examples.shapes.layer;import org.eclipse.draw2d.ColorConstants;import org.eclipse.draw2d.FreeformLayer;import org.eclipse.draw2d.Graphics;public class BackgroundLayer extends FreeformLayer {public static final String BACKGROUND_LAYER = "Background Layer";public BackgroundLayer() {setOpaque(true);}@Overrideprotected void paintFigure(Graphics graphics) {if(isOpaque()) {graphics.setForegroundColor(ColorConstants.white);graphics.setBackgroundColor(ColorConstants.lightBlue);graphics.fillGradient(getBounds(), true);}}}
我们最终扩展的是FreeformLayer而不是Layer, 如果直接扩展Layer的话,我们的层会无法自动改变大小。我们推荐从FreeformLayer开始你的工作。
实现MyRootEditPart
由于我们只需要插入一个层,所以我们重载ScalableFreeformRootEditPart中的createPrintableLayers方法就可以了。再次提醒的是要注意插入的位置,先加入的层在下,后加入的在上。
package org.eclipse.gef.examples.shapes.parts;import org.eclipse.draw2d.ConnectionLayer;import org.eclipse.draw2d.FreeformLayer;import org.eclipse.draw2d.FreeformLayeredPane;import org.eclipse.draw2d.LayeredPane;import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;import org.eclipse.gef.examples.shapes.layer.BackgroundLayer;public class MyRootEditPart extends ScalableFreeformRootEditPart {@Overrideprotected LayeredPane createPrintableLayers() {FreeformLayeredPane layeredPane = new FreeformLayeredPane();layeredPane.add(new BackgroundLayer(), BackgroundLayer.BACKGROUND_LAYER);layeredPane.add(new FreeformLayer(), PRIMARY_LAYER);layeredPane.add(new ConnectionLayer(), CONNECTION_LAYER);return layeredPane;}}
让我们自定义的RootEditPart生效是相当简单的事,只要修改ShapesEditor. configureGraphicalViewer(),将ScalableFreeformRootEditPart替换为MyRootEditPart即可。就不列出代码了。完成之后我们就可以看到画板有了一个渐进式的背景,如图2所示:
结束语
GEF中的几乎一切东西都可以定制,本文介绍的是层的定制,层对于一个复杂图形应用(比如布线程序)来说是非常重要的。GEF的RootEditPart是层创建的地方,同时getLayer()方法可以让我们方便的访问层对象,而添加一个自定义层也是相当简单。
- GEF 进阶,第三部分: Layer
- GEF 进阶,第一部分: Anchor
- GEF 进阶,第一部分: Anchor
- GEF 进阶,第二部分: Router
- GEF 进阶,第四部分: Locator
- GEF 进阶,第五部分: Viewer
- GEF 进阶,第六部分: Feedback
- 玩转Eclipse tools第三部分GEF
- GEF 进阶
- gef
- 吴恩达 神经网络和深度学习 第一部分课程 第三章课后习题 Planar data classification with a hidden layer
- 第三部分
- 网络部分之link layer
- 网络部分之Physical Layer
- java设计模式进阶_service-layer
- sql进阶部分
- Laravel-EloquentORM 进阶部分
- refactoring Patterns:第三部分
- JS,Jquery中事件冒泡以及阻止事件冒泡方法
- pthread_deatch
- 括号配对问题 栈实现
- javascript验证文本框内容,
- Android中SQLite的使用
- GEF 进阶,第三部分: Layer
- dotnet程序安装包添加卸载快捷方式
- 【并查集入门】HDU1232——畅通工程
- java版本的escape和unescape函数
- 关于VS2008中C/C++内存泄漏的定位的方法
- 【分布式系统工程实现】如何检测一台机器是否宕机?
- opencv中自带blobtrack运行演示
- uva10054-The Necklace(项链)
- 数据类型相互转换