使用GEF创建数据库模型编辑器

用过Eclipse相关产品的人经常会看到一些涉及到图形应用的插件,比如Struts、UML、DatabaseDesign相关的插件;或者企 业中自己要定制自己的图形化的工作流编辑器,组织结构图等。这些都涉及到图形编辑,以前我们大多用Win32 API或JFC/Java2D技术自己做框架来实现这些功能,复杂且工作量大!
GEF(Graphical Editor Framework)是现在Eclipse领域流行的图形编辑框架,它可以用来给用户提供图形化编辑模型的功能,从而提升用户体验。它同时具有 Windows的美观界面和JFC的跨平台能力,并可以与draw2D(Eclispe领域想要取代java2D的图形API)达到良好的结合。
GEF里用到了很多经典的结构模式和设计模式,如MVC,Policy,Command,Observer等,方便的实现Undo/Redo功能等等,通过学习GEF,也可以更好地掌握这些模式.
在本文中,我们将介绍GEF/draw2D,并简介用GEF如何一步步的做一个数据库模型编辑器。


读者朋友们可能已经看到了前面文章所介绍的Eclipse体系结构了,这里还有一张图对GEF与Eclispe平台之间的关系作了描述:SWT和 Draw2D的关系就相当于AWT与Java2D的关系,而GEF这个框架是基于ui.views和RCP(见本系列另一篇关于RCP的文章)概念之上 的。
 

说到GEF框架,还是要从我们熟悉的MVC模式说起,MVC是一种通用的涉及到UI交互的模式,通常Model代表数据的显示,View则负责在界面上呈 现数据,而Controller的职责是处理用户的输入以及根据Model的修改刷新View。一般情况下,一个UI(View)只被用于呈现一个 Model,但是在GEF里面任何View可以被用于呈现任意的Model,也就是说在GEF里View-to-Model的映射并不是1-to-1的, 在GEF中MVC的定义如下:
 

Model:任何GEF 应用的起点就是Model。它们需要被显示, 编辑和持久化。Model应该对View和Controller的细节一无所知,它仅仅可以把自己的改变负责通知给View和Controller,在 GEF中,Model只能被Commands所更新。
View:View包括Draw2D中一种虚拟组件Figure来呈现Model对象, GEF也支持SWT中的TreeItem对象。另外,与View相关的还包括feedback,handle,tooltip等等。所有这些View组件 都由Controller来构建和管理它们。
Controller:就是EditPart,EditPart在GEF里面是最关键的组件,负责管理整个View层面的所有组件。后面会有详细 介绍
 

在我们的这个数据库模型编辑器中,我们定义了我们的MVC架构:

我们的Model:
我们的Model分成如下几种:
• Table: 代表一张关系数据库表。 唯一的属性是表名
• Column: 数据库表的列。 我们比较感兴趣的属性是列名和数据类型( 可能是VARCHAR 或整型)。
• Relationship: 表现为两张数据库表之间的主外键关系。
• Schema: 简单地可以代表所有表的分组。
我们的模型很简单, 但至少包括在一个典型的GEF 模型中两种关键的对象关系:
• 在table和schema之间以及table和column之间存在父子关系
• 在不同的节点(Node)之间的连接关系。 在我们的例子中, connection是以主外键       关系的形式

我们的View
在View这一部分的介绍,我们分别介绍Figure和布局管理器这两部分:

Figure
Figure在draw2d 中是一种创建复杂图形的轻量级对象。视图则是由一组反映model的Figures来组建的。 在典型的GEF 应用中, 您通常会创建一组定制的Figure类并实现IFigure 接口。

在我们的应用中有以下的Figure:

EditableLabel: draw2d中Label的子类。 用于为column和table命名。
ColumnsFigure: 所有column的一个容器。
TableFigure: 包含EditableLabel 和ColumnsFigure
SchemaFigure: 在Schema中包含所有TableFigures
另外,我们并未提供任何特别的figure来代表图中的连接线, 我们简单地使用draw2d 的PolylineConnection 类, 来代表一条有0或多个拐点(bend point) 的连接线。

由于表名,列名,列数在一个TableFigure 实例的生命周期内可以增加或减少的, 我们也可以重设我们的ColumnsFigure 和TableFigure的尺寸。这个功能由布局管理器(draw2d 的另一个重要部份)担当。

布局管理器
GEF 提供与Swing和SWT 的LayoutManager不同的一个布局管理框架: 它的职责是处理实现draw2d IFigure的Figure的布局。应用开发者将决定用某个LayoutManager来布局每一个包含子Figure的Figure。

宽泛地讲, 有三类型LayoutManager:
• 结构化布局管理器,比如FlowLayout 和ToolbarLayout, 可以根据子figure的次序来垂直或水平地布局
• 基于约束的布局管理器,譬如XYLayout 和DelegatingLayout 。为每个子figure设置一个Constraint对象。 在XYLayout 情况下, 这个对象是一个Rectangle对象来指定位置和尺寸。
• 使用几何算法的布局管理器, 这种布局为子figure运用一系列的相当复杂算法来计算布局。这种 算法采取一种特殊的数据结构作为譬如Node的安置和path的路由之类几何问题的解决方案。GEF 由DirectedGraphLayout 和CompoundDirectedGraphLayout提供算法。
 

GEF 开发者需要理解特定的LayoutManager被应用于特定的情况。在我们的应用中ColumnsFigure 使用FlowLayout来布局它的Label组件。TableFigure 使用ToolbarLayout 来布局它的子组件(简单地垂直摆放) 。大家可以看一下TableFigure的初始化过程:

java 代码
  1. public TableFigure(EditableLabel name, List colums)   
  2. {   
  3. nameLabel = name;   
  4. ToolbarLayout layout = new ToolbarLayout();   
  5. layout.setVertical(true);   
  6. layout.setStretchMinorAxis(true);   
  7. setLayoutManager(layout);   
  8. setBorder(new LineBorder(ColorConstants.black, 1));   
  9. setBackgroundColor(tableColor);   
  10. setForegroundColor(ColorConstants.black);   
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值