本文举例源代码或素材下载
前面
![](/icons/20025de.gif)
帖子里曾说过如何使用布局
![](/icons/20025dou.gif)
当时主要集中在ToolbarLayout和FlowLayout(统称OrderedLayout)
![](/icons/20025dou.gif)
还有很多应用
![](/icons/20025chengxu.gif)
使用
![](/icons/20025de.gif)
是可以自由拖动子图形
![](/icons/20025de.gif)
布局
![](/icons/20025dou.gif)
在GEF里称为XYLayout
![](/icons/20025dou.gif)
而且这样
![](/icons/20025de.gif)
应用多半会需要在图形的间建立
![](/icons/20025yi.gif)
些连接线
![](/icons/20025dou.gif)
比如下图所示
![](/icons/20025de.gif)
情景
![](/icons/20025dou2.gif)
连接
![](/icons/20025de.gif)
出现在
![](/icons/20025yi.gif)
定程度上增加了模型
![](/icons/20025de.gif)
复杂度
![](/icons/20025dou.gif)
连接线
![](/icons/20025de.gif)
刷新也是GEF关注
![](/icons/20025de.gif)
![](/icons/20025yi.gif)
个问题
![](/icons/20025dou.gif)
这里就主要讨论这类应用
![](/icons/20025de.gif)
实现
![](/icons/20025dou.gif)
并将特别讨论
![](/icons/20025yi.gif)
下展开/折叠(expand/collapse)功能
![](/icons/20025de.gif)
实现
![](/icons/20025dou2.gif)
![](http://www.crazycoder.cn/WebFiles/20091/d4701887-3350-466d-8190-ea854d0b2d5c.g<img src='/icons/20025if.gif' />)
).getModel
![](/icons/20025kh.gif)
;
![](/icons/20025if.gif)
(!subject.isCollapsed
![](/icons/20025kh.gif)
) {
![](/icons/20025return.gif)
attribute.getOutgoingConnections
![](/icons/20025kh.gif)
;
}
![](/icons/20025else.gif)
{
![](/icons/20025return.gif)
Collections.EMPTY_LIST;
}
}由于getModelTargetConnections
![](/icons/20025kh.gif)
![](/icons/20025de.gif)
代码和getModelSourceConnections
![](/icons/20025kh.gif)
非常类似
![](/icons/20025dou.gif)
这里就不列出其内容了
![](/icons/20025dou2.gif)
在
![](/icons/20025yi.gif)
般情况下
![](/icons/20025dou.gif)
我们只让
![](/icons/20025yi.gif)
个EditPart监听
![](/icons/20025yi.gif)
个模型
![](/icons/20025de.gif)
变化
![](/icons/20025dou.gif)
但是请记住
![](/icons/20025dou.gif)
GEF框架并没有规定EditPart和被监听
![](/icons/20025de.gif)
模型
![](/icons/20025yi.gif)
![](/icons/20025yi.gif)
对应(实际上GEF中
![](/icons/20025de.gif)
很多设计就是为了减少对开发人员
![](/icons/20025de.gif)
限制)
![](/icons/20025dou.gif)
因此在必要时我们大可以根据自己
![](/icons/20025de.gif)
需要灵活运用
![](/icons/20025dou2.gif)
在实现展开/折叠功能时
![](/icons/20025dou.gif)
子元素
![](/icons/20025de.gif)
EditPart应该能够监听所在容器
![](/icons/20025de.gif)
状态变化
![](/icons/20025dou.gif)
当collapsed值改变时更新和子图形相关
![](/icons/20025de.gif)
连接线(若不进行更新则这些连接线会变成"无头线")
![](/icons/20025dou2.gif)
让子元素EditPart监听容器模型
![](/icons/20025de.gif)
变化很简单
![](/icons/20025dou.gif)
只要在AttributePart
![](/icons/20025de.gif)
activate
![](/icons/20025kh.gif)
里把自己作为监听器加到容器模型
![](/icons/20025de.gif)
监听器列表即可
![](/icons/20025dou.gif)
注意别忘记在deactivate
![](/icons/20025kh.gif)
里注销掉
![](/icons/20025dou.gif)
而propertyChange
![](/icons/20025kh.gif)
思路方法里是事件发生时
![](/icons/20025de.gif)
处理
![](/icons/20025dou.gif)
代码如下:
public void activate
{
super.activate
;
((Attribute) getModel
).addPropertyChangeListener(this);
((Subject) getParent
.getModel
).addPropertyChangeListener(this);
}
public void deactivate
{
super.deactivate
;
((Attribute) getModel
).removePropertyChangeListener(this);
((Subject) getParent
.getModel
).removePropertyChangeListener(this);
}
public void propertyChange(PropertyChangeEvent evt) {
(evt.getPropertyName
.equals(Subject.PROP_COLLAPSED)) {
refreshSourceConnections
;
refreshTargetConnections
;
}
super.propertyChange(evt);
}
这样
![](/icons/20025dou.gif)
基本上就实现了容器
![](/icons/20025de.gif)
展开/折叠功能
![](/icons/20025dou.gif)
的所以说"基本上"
![](/icons/20025dou.gif)
是
![](/icons/20025yinwei.gif)
我没有做仔细
![](/icons/20025de.gif)
测试(时间关系)
![](/icons/20025dou.gif)
目前
![](/icons/20025de.gif)
代码有可能会存在问题
![](/icons/20025dou.gif)
特别是在Undo/Redo以及多重选择这些情况下;另外
![](/icons/20025dou.gif)
这种思路方法只适用于容器里
![](/icons/20025de.gif)
子元素不是容器
![](/icons/20025de.gif)
情况
![](/icons/20025dou.gif)
如果有多层
![](/icons/20025de.gif)
容器关系
![](/icons/20025dou.gif)
则每
![](/icons/20025yi.gif)
层都要做类似
![](/icons/20025de.gif)
处理才可以