同事和我做同一件事情,但是我弄的总有个问题。
对比了我们各自写的文件,在表面上完全没有那里存在问题。
在前段的时间中也遇到相应的问题,原来是加上一个布局就可以了。
setLayoutManager(new ConstrainedToolbarLayout());
再次遇到一样的问题,想查查到底是什么问题。经过对比使用布局和不使用的调试结果后。
大概问题如下:
GEF在用户操作会提供一个“鬼影”的提示。获得的FeedBack的大小由操作的图形的MinSize和操作后的Bounds决定。
org.eclipse.gmf.runtime.diagram.ui.editpolicies.ResizableEditPolicyEx.showChangeBoundsFeedback(ChangeBoundsRequest)
protected void showChangeBoundsFeedback(ChangeBoundsRequest request) {
IFigure feedback = getDragSourceFeedbackFigure();
// 获得操作后的大小
PrecisionRectangle rect = new PrecisionRectangle(getInitialFeedbackBounds().getCopy());
getHostFigure().translateToAbsolute(rect);
rect.translate(request.getMoveDelta());
rect.resize(request.getSizeDelta());
IFigure f = getHostFigure();
// 最小的大小
Dimension min = f.getMinimumSize().getCopy();
Dimension max = f.getMaximumSize().getCopy();
IMapMode mmode = MapModeUtil.getMapMode(f);
min.height = mmode.LPtoDP(min.height);
min.width = mmode.LPtoDP(min.width);
max.height = mmode.LPtoDP(max.height);
max.width = mmode.LPtoDP(max.width);
if (min.width>rect.width)
rect.width = min.width;
else if (max.width < rect.width)
rect.width = max.width;
if (min.height>rect.height)
rect.height = min.height;
else if (max.height < rect.height)
rect.height = max.height;
feedback.translateToRelative(rect);
feedback.setBounds(rect);
}
而Figure的getMinimumSize()方法中,当用户没有直接设置minSize,又没有设置布局管理器LayoutManager的话,会返回preferredSize。最终返回了当前图形Figure的size/bounds。
public final Dimension getMinimumSize() {
return getMinimumSize(-1, -1);
}
public Dimension getMinimumSize(int wHint, int hHint) {
if (minSize != null)
return minSize;
if (getLayoutManager() != null) {
Dimension d = getLayoutManager().getMinimumSize(this, wHint, hHint);
if (d != null)
return d;
}
return getPreferredSize(wHint, hHint);
}
public final Dimension getPreferredSize() {
return getPreferredSize(-1, -1);
}
public Dimension getPreferredSize(int wHint, int hHint) {
if (prefSize != null)
return prefSize;
if (getLayoutManager() != null) {
Dimension d = getLayoutManager().getPreferredSize(this, wHint,
hHint);
if (d != null)
return d;
}
return getSize();
}
这样用户看到的看到的FeedBack就是当前大小,导致出现不能缩小的窘境/囧。
<------------------------------------->
2/ 在准备写的时刻又遇到了一个问题,既然我们看到的FeedBack是控制了,但是FeedBack是在request已经生成后才呈现给用户看的,那么又是怎样反过来改变Request的呢?
其实,GMF并没有再次处理Request,比minSize小,照样修改模型的数据。
3/ 只是在重绘的时刻,通过layoutmanager#layout(),重新计算孩子的大小,而layout()则会调用min,max,perfectSize来重新设置Bounds。
org.eclipse.gmf.runtime.diagram.ui.layout.FreeFormLayoutEx.layout(IFigure)
分享到:
相关推荐
综述了图形建模框架GMF,对于认识GMF,以及演说报告都有参考价值。
现在GMF的资源比较稀缺, 我提供了一个基于GMF的图形化数据建模的例子,供大家参考,既可以作为自己数据库设计的轻量级工具,也可以作为学习GMF的参考
GMF 学习资料 GMF中的小知识点、GMF 教程 Mindmap等
15 分钟学会 Eclipse GMF 15 分钟学会 Eclipse GMF
关于eclipse gmf插件的相关插件工具
org.eclipse.gmf.rar org.eclipse.gmf.rar org.eclipse.gmf.rarorg.eclipse.gmf.rar
GMF Tutorial中文版——一套入门教程
GMF 教程 Mindmap,本文是跟着英文教程做了一遍,并简单翻译、截图,做了一些补充,总算是实现了原文的效果。
eclipse 图形化开发 插件 gmf
主要是对自己做的项目的一些总结,包括如何自动添加图元、删除图元,建立连线,获得编辑器的EditPart,不打开编辑器,获取编辑器的EditPart,属性居中,自动保存图片等功能的实现。另外还有一些参考资料
GMF实例解析.pdf
GMF实例解析的pdf版,有需要的可以下载回去看
详细描述GMF的操作过程,GMF 开发文档。
eclipse 3.2下的gef,ve,gmf,经过自己的收集,把三个都收集齐了,一并传上,希望对大家有用
我对于GMF Tourial(一)的中文翻译,有需要的可一下载回去看
GMF入门资料,适合初学者学习,很经典
Graphical Modeling Framework,图形化建模框架
GMF开发FSM的完整的例子,非常详细。教你如何开发自己的建模工具
使用Eclipse GMF进行可视化建模的实战资料,包含概念介绍和示例代码。
GMF