用GEF做流程图编辑器时,当流程图比较复杂,单个屏幕无法完全显示的时候就会出现滚动条。当有滚动条的时候,一些图形控件的位置计算就会出现相应的偏差。很明显的一个例子就是直接在图形上进行编辑时出现的那个输入框,gef里叫做NodeDirectEditCell。
如下图所示:
编辑框的弹出位置并没有落在testNode上,它的偏移距离恰好是滚动条的滚动位移。这在JavaScript里是很好解决的,在gef里也很容易,只是网上资料繁多一直都没有找到。当初看JBPM可视化插件源码的时候,想看看它是如何找到这个偏移量的,可是它并没有解决这个问题,不知道新的版本中有没有解决。没办法,只有自己一点一点找了。
这里关键的是要实现org.eclipse.gef.tools.CellEditorLocator这个借口,在relocate方法里计算出真实位置。废话少说直接上代码:
public class NodeCellEditorLocator implements CellEditorLocator {
private NodeFigure nodeFigure;
/**
* Creates a new ActivityCellEditorLocator for the given Label
*
* @param nodeFigure
* the Label
*/
public NodeCellEditorLocator(NodeFigure nodeFigure) {
this.nodeFigure = nodeFigure; //得到当前编辑的figure
}
/**
* @see CellEditorLocator#relocate(org.eclipse.jface.viewers.CellEditor)
*/
public void relocate(CellEditor celleditor) {
Text text = (Text) celleditor.getControl();
int scrollWidth = 0;//东西偏移量
int scrollHeight = 0;//南北偏移量
FigureCanvas canvas = (FigureCanvas) text.getParent(); // 得到滚动区域的画布
scrollWidth = canvas.getViewport().getHorizontalRangeModel().getValue();
scrollHeight = canvas.getViewport().getVerticalRangeModel().getValue();
Point pref = text.computeSize(SWT.DEFAULT, SWT.DEFAULT);
Rectangle rect = this.nodeFigure.getTextBounds(); //得到覆盖的文本label
text.setBounds(rect.x - 1 - scrollWidth, rect.y - 1 - scrollHeight,
pref.x + 1, pref.y + 1);
}
}
最终效果图:
PS:前几天面试时被问到一个问题:当流程图比较复杂时,一个屏幕显示不下,用什么方法能够得到更好的用户操作?我回答说:可以考虑折叠功能,用户可以把嵌套的节点折叠起来。感觉和面试官预期的答案不是这个,后来想想整个画布的zoom in/zoom out更好一些.
- 大小: 5.5 KB
- 大小: 4.2 KB
分享到:
相关推荐
1. 往画布上添加多种节点 2. 节点之间的连线 3. 节点内容的编辑功能 4. 删除连线 5. 删除节点 6. 对节点的拖动以改变位置 运行这个例子的方法: 0. 必须要有一个Eclipse RCP的开发环境 1. 在你的Eclipse中要有GEF, ...
GEF入门必读 GEF入门系列 GEF-whole-upload 感谢八进制
我下的资源的打包,希望有帮助,包括:GEF_Tutorial,GEF实例,入门教程,GEF-whole-upload
GEF简易教程-学习GEF的入门教程,不错的gef入门教程
gef 绘图折线的实现方法。 gef API chm 格式
GEF eclipse 插件
GEF: Graphical Editing Framework <br>GEF是一套MVC Framework,它能帮你比较容易的建立图形化的编辑器,V(View)的部分常常是基于SWT的Draw2D,因此Draw2D也看作是GEF的一部分。依赖:org.eclipse.gef***, org...
一个GEF的例子,例子中展示了利用GEF往画布上添加节点 删除节点,以及树形展现等得荣
GEF.rar GEF.rar GEF.rar
Agenda Start things off What is GEF? GEF Demo Draw2d Overview Example GEF Overview Break Hands-on Activity: Shapes Example
GEF理解之第三部分,学习gef必备文档资料啊,值得下载
GEF理解之第一部分,学习gef必备文档资料啊,值得下载
这是我自己在学习GEF的时候做的一些总结。 1、GEF中的概念比如Command,Tool,Request等等。 2、GEF中使用到的几种设计模式。 3、GEF中对鼠标键盘事件处理的机制、流程。
Eclipse插件GEF的介绍,对于学习GEF有很大帮助
GEF-ALL-3.7 GEF-ALL-3.8 官方包。 GEF Draw2d 学习资料
GEF 入门系列 GEF
gef开发实例 gef开发的好例子,比较简单的实现了MVC的架构
GEF Example Source Code,
一本很好的GEF入门教程,通过实例详细的描述了GEF开发的全流程。
Gef入门开发,详细解析。 Gef入门开发,详细解析 Gef入门开发,详细解析