专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » eclipsegef:[Eclipse]GEF入门系列( 7、XYLayout和展开/折叠功能) »正文

eclipsegef:[Eclipse]GEF入门系列( 7、XYLayout和展开/折叠功能)

来源: 发布时间:星期四, 2009年1月8日 浏览:103次 评论:0
  本文举例源代码或素材下载

  前面帖子里曾说过如何使用布局当时主要集中在ToolbarLayout和FlowLayout(统称OrderedLayout)还有很多应用使用是可以自由拖动子图形布局在GEF里称为XYLayout而且这样应用多半会需要在图形的间建立些连接线比如下图所示情景连接出现在定程度上增加了模型复杂度连接线刷新也是GEF关注个问题这里就主要讨论这类应用实现并将特别讨论下展开/折叠(expand/collapse)功能实现

).getModel;
   (!subject.isCollapsed) {
     attribute.getOutgoingConnections;
  } {
     Collections.EMPTY_LIST;
  }
}由于getModelTargetConnections代码和getModelSourceConnections非常类似这里就不列出其内容了般情况下我们只让个EditPart监听个模型变化但是请记住GEF框架并没有规定EditPart和被监听模型对应(实际上GEF中很多设计就是为了减少对开发人员限制)因此在必要时我们大可以根据自己需要灵活运用在实现展开/折叠功能时子元素EditPart应该能够监听所在容器状态变化当collapsed值改变时更新和子图形相关连接线(若不进行更新则这些连接线会变成"无头线")让子元素EditPart监听容器模型变化很简单只要在AttributePartactivate里把自己作为监听器加到容器模型监听器列表即可注意别忘记在deactivate里注销掉而propertyChange思路方法里是事件发生时处理代码如下:

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);
}
这样基本上就实现了容器展开/折叠功能的所以说"基本上"我没有做仔细测试(时间关系)目前代码有可能会存在问题特别是在Undo/Redo以及多重选择这些情况下;另外这种思路方法只适用于容器里子元素不是容器情况如果有多层容器关系则每层都要做类似处理才可以

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: