GEF中文教程 自学笔记 2

目标:1. 管理多个模型。创建一个模型ContentsModel保存整个图形的信息,管理多个HelloModel模型。
2. 布局管理器XYLayout简介。


步骤:
1. 创建图形集模型ContentsModel。
很明显,ContentsModel需要维护一个children list用来保存HelloModel子模型。

2. 创建ContentsModel的控制器ContentsEditPart。
前一节说过GEF通过解析作为input的contents,在EditPartFactory的帮助下创建出模型对应的EditParts。问题是模型中的Containment关系或者说父子关系,GEF如何知道?这就需要我们在具体的EditPart实现类中重载getModelChildren()方法告知该模型的子模型是什么,使得对应的子EditParts能够正确的创建。
protected List getModelChildren() {
    return ((ContentsModel) getModel()).getChildren();
}

3. 连接图形集模型ContentsModel和它的控制器ContentsEditPart。
修改下PartFactory类,加上
if (modelElement instanceof ContentsModel)
    return new ContentsEditPart();
连接模型与控制器就是如此简单。
4. 修改viewer中显示的模型为ContentsModel。
创建一个ContentsModel的实例,把一个HelloModel实例加到它的children list中,最后把这个ContentsModel的实例作为viewer的input。

5. 美化Hello World的图形。
修改HelloEditPart的createFigure()方法创建的Label,为该Label设置边框、背景色和透明。

6. 注意到ContentsEditPart的createFigure()方法还是返回null,ContentsEditPart应该生成什么样的figure呢?
我们将使用布局管理器(LayoutManager)。布局管理器负责放置子图形,并决定自身的理想大小。
protected IFigure createFigure() {
    Layer figure = new Layer();
    figure.setLayoutManager(new XYLayout());
    return figure;
}
这儿使用了XYLayout,这种布局管理器允许图形自由的移动。

7. 可以运行看看效果了。
惨啊,什么都没有!

8. 问题出在哪儿呢?我们使用了XYLayout,它的layout方法遍历所有的子figure。对每个子figure,去获取constraint(Rectangle实例,表明子figure的位置和大小),如果没有设置constraint,就会忽略掉这个figure。
那么在哪儿设置constraint呢?GEF给出的地方是在AbstractEditPart类的抽象方法refreshVisuals中把约束施加给图形
为HelloEditPart重载refreshVisuals方法:
protected void refreshVisuals() {
    ((GraphicalEditPart) getParent()).setLayoutConstraint(this,
        getFigure(), new Rectangle(30, 30, -1, -1));
}
再次运行,HelloWorld就能正确显示了,位置在(30, 30),大小为正好能显示Hello World。

9. GEF中图形在视图中的位置和图形的大小(称为约束Constraint)是由其模型定义的。所以HelloModel中要加上一个属性Rectangle constraint。这个constraint在HelloEditPart类的refreshVisuals方法中传给HelloEditPart对应的figure的父figure,也就是Layer对象,用来给layout()方法提供绘图所需要的信息。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值