[zt]GEF 进阶,第三部分: Layer

FROM:http://www.ibm.com/developerworks/cn/opensource/os-ecl-gef/part3/index.html

马 若劼 (maruojie@cn.ibm.com), 软件工程师

2006 年 11 月 30 日

在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即可。以下是一段示例代码,斜黑体部分就是具体的调用: 

java 代码

 

  1. protected void configureGraphicalViewer() {   
  2.  super.configureGraphicalViewer();   
  3.     
  4.  GraphicalViewer viewer = getGraphicalViewer();   
  5.  viewer.setRootEditPart(new ScalableFreeformRootEditPart());   
  6.   
  7.  // more code   
  8.  ……………   
  9. }   
  10.   


所以,这是我们能够自定义层的一个前提。

ScalableFreeformRootEditPart的createLayers()方法是创建层的关键所在,仔细观察其实现,不难看出GEF缺省定义了如图1所示的层次结构:


图1. ScalableFreeformRootEditPart缺省层结构
 图1. ScalableFreeformRootEditPart缺省层结构 

提示: 先添加的层在下,后添加的层在上

我们看到缺省包含了很多层,而且层中还有子层,每个层都有一个关键字来标识,我们从下到上做一个简要的描述:

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方法就可以了。如下

java 代码
  1. package org.eclipse.gef.examples.shapes.layer;   
  2.   
  3. import org.eclipse.draw2d.ColorConstants;   
  4. import org.eclipse.draw2d.FreeformLayer;   
  5. import org.eclipse.draw2d.Graphics;   
  6.   
  7. public class BackgroundLayer extends FreeformLayer {   
  8.  public static final String BACKGROUND_LAYER = "Background Layer";   
  9.     
  10.  public BackgroundLayer() {   
  11.   setOpaque(true);   
  12.  }   
  13.     
  14.  @Override  
  15.  protected void paintFigure(Graphics graphics) {   
  16.   if(isOpaque()) {   
  17.    graphics.setForegroundColor(ColorConstants.white);   
  18.    graphics.setBackgroundColor(ColorConstants.lightBlue);   
  19.    graphics.fillGradient(getBounds(), true);   
  20.   }   
  21.  }   
  22. }   


我们最终扩展的是FreeformLayer而不是Layer, 如果直接扩展Layer的话,我们的层会无法自动改变大小。我们推荐从FreeformLayer开始你的工作。

实现MyRootEditPart

由于我们只需要插入一个层,所以我们重载ScalableFreeformRootEditPart中的createPrintableLayers方法就可以了。再次提醒的是要注意插入的位置,先加入的层在下,后加入的在上。

java 代码
  1. package org.eclipse.gef.examples.shapes.parts;   
  2.   
  3. import org.eclipse.draw2d.ConnectionLayer;   
  4. import org.eclipse.draw2d.FreeformLayer;   
  5. import org.eclipse.draw2d.FreeformLayeredPane;   
  6. import org.eclipse.draw2d.LayeredPane;   
  7. import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;   
  8. import org.eclipse.gef.examples.shapes.layer.BackgroundLayer;   
  9.   
  10. public class MyRootEditPart extends ScalableFreeformRootEditPart {   
  11.  @Override  
  12.  protected LayeredPane createPrintableLayers() {   
  13.   FreeformLayeredPane layeredPane = new FreeformLayeredPane();   
  14.   layeredPane.add(new BackgroundLayer(), BackgroundLayer.BACKGROUND_LAYER);   
  15.   layeredPane.add(new FreeformLayer(), PRIMARY_LAYER);   
  16.   layeredPane.add(new ConnectionLayer(), CONNECTION_LAYER);   
  17.   return layeredPane;   
  18.  }   
  19. }   
  20.     


让我们自定义的RootEditPart生效是相当简单的事,只要修改ShapesEditor. configureGraphicalViewer(),将ScalableFreeformRootEditPart替换为MyRootEditPart即可。就不列出代码了。完成之后我们就可以看到画板有了一个渐进式的背景,如图2所示:


图2. 背景层
 图2. 背景层  

结束语

GEF中的几乎一切东西都可以定制,本文介绍的是层的定制,层对于一个复杂图形应用(比如布线程序)来说是非常重要的。GEF的RootEditPart是层创建的地方,同时getLayer()方法可以让我们方便的访问层对象,而添加一个自定义层也是相当简单。

下载

名字大小下载方法
org.eclipse.gef.examples.shapes_anchor.zip HTTP

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值