虽然很多GEF应用
![](/icons/52088chengxu.gif)
里都会用到连接(Connection)
![](/icons/52088dou.gif)
但也有
![](/icons/52088yi.gif)
些应用是不需要用连接来表达关系
![](/icons/52088de.gif)
![](/icons/52088dou.gif)
我们目前正在做
![](/icons/52088de.gif)
这个项目就是这样
![](/icons/52088yi.gif)
个例子
![](/icons/52088dou2.gif)
在这类应用中
![](/icons/52088dou.gif)
模型对象间
![](/icons/52088de.gif)
关系主要通过图形
![](/icons/52088de.gif)
包含来表达
![](/icons/52088dou.gif)
所以大多是
![](/icons/52088yi.gif)
对多关系
![](/icons/52088dou2.gif)
![](http://www.crazycoder.cn/WebFiles/20091/24d32e62-7fc1-4f1c-babb-3717209c179c.g<img src='/icons/52088if.gif' />)
this.label.
![](/icons/52088set.gif)
Text(text);
this.repa
![](/icons/52088int.gif)
![](/icons/52088kh.gif)
;
}
public void
![](/icons/52088set.gif)
Bounds(Rectangle rect) {
super.
![](/icons/52088set.gif)
Bounds(rect);
this.label.
![](/icons/52088set.gif)
Bounds(rect);
}
}
单元格
![](/icons/52088de.gif)
布局管理器同样使用FillLayout
![](/icons/52088dou.gif)
![](/icons/52088yinwei.gif)
在需求中
![](/icons/52088dou.gif)
用户向单元格里添加第
![](/icons/52088yi.gif)
个节点时
![](/icons/52088dou.gif)
该节点要充满单元格;当单元格里有两个节点时
![](/icons/52088dou.gif)
每个节点占 2分的
![](/icons/52088yi.gif)
![](/icons/52088de.gif)
高度;依次类推
![](/icons/52088dou2.gif)
下面
![](/icons/52088de.gif)
表格整理总结了各个图形使用
![](/icons/52088de.gif)
布局管理
![](/icons/52088dou2.gif)
由表可见
![](/icons/52088dou.gif)
只有包含子图形
![](/icons/52088de.gif)
那些图形才需要布局管理器
![](/icons/52088dou.gif)
原因很明显:布局管理器关心和管理
![](/icons/52088de.gif)
是"子"图形
![](/icons/52088dou.gif)
请时刻牢记这
![](/icons/52088yi.gif)
点
![](/icons/52088dou2.gif)
布局管理器 直接子图形
画布 ToolbarLayout 列
列 ColumnLayout 列头部、列下部
-列头部 无 无
-列下部 FillLayout 单元格
单元格 FillLayout 节点
节点 无 无
这里需要特别提醒
![](/icons/52088yi.gif)
点:在
![](/icons/52088yi.gif)
个图形使用ToolbarLayout或子类作为布局管理器时
![](/icons/52088dou.gif)
图形对应
![](/icons/52088de.gif)
EditPart上如果安装了FlowLayoutEditPolicy或子类
![](/icons/52088dou.gif)
你可能会得到
![](/icons/52088yi.gif)
个ClassCastException异常
![](/icons/52088dou2.gif)
例如例子中
![](/icons/52088de.gif)
CellFigure
![](/icons/52088dou.gif)
它对应
![](/icons/52088de.gif)
EditPart是CellPart
![](/icons/52088dou.gif)
其上安装了CellLayoutEditPolicy是FlowLayoutEditPolicy
![](/icons/52088de.gif)
![](/icons/52088yi.gif)
个子类
![](/icons/52088dou2.gif)
出现这个异常
![](/icons/52088de.gif)
原因是在FlowLayoutEditPolicy
![](/icons/52088de.gif)
isHorizontal
![](/icons/52088kh.gif)
思路方法中会将图形
![](/icons/52088de.gif)
layout强制转换为FlowLayout
![](/icons/52088dou.gif)
而我们使用
![](/icons/52088de.gif)
是ToolbarLayout
![](/icons/52088dou2.gif)
我认为这是GEF
![](/icons/52088de.gif)
![](/icons/52088yi.gif)
个疏忽
![](/icons/52088dou.gif)
![](/icons/52088yinwei.gif)
作者曾说过FlowLayout可应用于ToolbarLayout
![](/icons/52088dou2.gif)
幸好解决思路方法也不复杂:在你
![](/icons/52088de.gif)
那个EditPolicy中覆盖isHorizontal
![](/icons/52088kh.gif)
思路方法
![](/icons/52088dou.gif)
在这个思路方法里先判断layout是ToolbarLayout还是FlowLayout
![](/icons/52088dou.gif)
再根据结果返回合适
![](/icons/52088de.gif)
boolean值即可
![](/icons/52088dou2.gif)
最后
![](/icons/52088dou.gif)
有关我们
![](/icons/52088de.gif)
画布还有
![](/icons/52088yi.gif)
个问题没有解决
![](/icons/52088dou.gif)
我们希望表格列增多到
![](/icons/52088yi.gif)
定程度后
![](/icons/52088dou.gif)
画布可以向右边扩展尺寸
![](/icons/52088dou.gif)
前面说过画布使用
![](/icons/52088de.gif)
是FreeformLayer作为图形
![](/icons/52088dou2.gif)
为了达到目
![](/icons/52088de.gif)
![](/icons/52088dou.gif)
还必须在editor里设置rootEditPart为ScalableRootEditPart
![](/icons/52088dou.gif)
要注意不是ScalableFreeformRootEditPart
![](/icons/52088dou.gif)
后者在需要各个方向都能扩展
![](/icons/52088de.gif)
画布
![](/icons/52088de.gif)
应用
![](/icons/52088chengxu.gif)
中经常被使用
![](/icons/52088dou2.gif)
有关各种RootEditPart
![](/icons/52088de.gif)
使用方法
![](/icons/52088dou.gif)
在后续帖子里将会介绍到
![](/icons/52088dou2.gif)
以上结合具体例子讲解了如何在GEF中使用ToolbarLayout以及自定义简单
![](/icons/52088de.gif)
布局管理器
![](/icons/52088dou2.gif)
我们构造图形应该遵守
![](/icons/52088yi.gif)
个原则
![](/icons/52088dou.gif)
那就是尽量让布局管理器决定每个子图形
![](/icons/52088de.gif)
位置和尺寸
![](/icons/52088dou.gif)
这样可以避免很多麻烦
![](/icons/52088dou2.gif)
当然也有例外
![](/icons/52088dou.gif)
比如在XYLayout这种只关心子图形位置
![](/icons/52088de.gif)
布局管理器中
![](/icons/52088dou.gif)
就必须为每个子图形指定尺寸
![](/icons/52088dou.gif)
否则图形将
![](/icons/52088yinwei.gif)
尺寸过小而不可见
![](/icons/52088dou.gif)
这也是
![](/icons/52088yi.gif)
个开发人员十分容易疏忽
![](/icons/52088de.gif)
地方