`
lggege
  • 浏览: 375471 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

GEF实践总结(二)常见基础性问题

    博客分类:
  • GEF
阅读更多

一. 怎么通过model创建对应的EditPart?
EditPartFactory :通过model创建对应EditPart的工厂类。
就和jface.TableView一样,能知道通过model得到TableItem。和jface.TreeViewer一样,能通过model知道要生成对应的TreeItem一样的功效。

@Override
public EditPart createEditPart(EditPart context, Object model) {
EditPart part = null;
if (model instanceof DiagramModel) {
part = new DiagramEditPart();
} else if (model instanceof RectModel) {
part = new RectEditPart();
}
part.setModel(model);
return part;
}

 


二. EditPart怎么创建对应的Figure?
在EditPart中有一个方法必须实现,就是createFigure方法。

@Override
protected IFigure createFigure() {
RectFigure figure = new RectFigure();
figure.setModel((BaseModel) this.getModel());
return figure;
}

 


这样就把EditPart和对应的Figure关联起来了,知道如何通过EditPart创建出一个对应的Figure。

三. Model改变,如何对外通知?
Model中有PropertyChangeSupport,外部可以往model中注册PropertyChangeListener,也就是对模型属性改变的监听器,如果model的属性发生了改变,那么就会对所有的listener通知这个属性变化。通知内容包括改变的属性名称、老的值、新的值。

 

protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
changeSupport.firePropertyChange(propertyName, oldValue, newValue);
}
public void setX(int x) {
int oldX = this.x;
this.x = x;
this.firePropertyChange(“X”, oldX, x);
}

 

比如:上面的代码,当属性x发生变化的时候就对外通知”X”发生了变化,值从oldX变成了x。

四. EditPart是何时将自己注册到model的呢?
EditPart都是实现了PropertyChangeListener接口,表示:自身就是一个属性变化的监听器,可以对被监听者(比如model)的属性改变进行监听。见下面的代码:

 

/**
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#activate()
*/
public void activate() {
if (!isActive()) {
super.activate();
((BaseModel) getModel()).addPropertyChangeListener(this);
}
}

/**
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#deactivate()
*/
public void deactivate() {
if (isActive()) {
super.deactivate();
((BaseModel) getModel()).removePropertyChangeListener(this);
}
}

 

在EditPart被激活的时候(activate),就已经将自己作为监听器放入了model中了,在EditPart被销毁的时候(deactivate)的时候去掉的model的监听。

五. EditPart得知属性改变后做了什么事情?

/**
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
*/
@Override
public void propertyChange(PropertyChangeEvent evt) {
String property = evt.getPropertyName();

if (IPropertyConst.CHILDREN.equals(property)) {
refreshChildren();
} else {
refreshVisuals();
}
}

 

上面的这段代码,说明了,当被监听者(model)的属性改变的时候,EditPart得知属性改变后做了什么事情。如果是添加或删除了孩子模型(Children),那么就是刷新所有小孩,重新绘制他们。其他的属性改变的时候,就把自己刷新一下(当然refreshVisuals中还有更多的逻辑)。

六. Model如何告诉Figure具体绘图的位置?

/**
* @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals()
*/
protected void refreshVisuals() {
BaseModel model = (BaseModel) getModel();
Rectangle bounds = new Rectangle(model.getX(), model.getY(), model.getW(), model.getY());
((GraphicalEditPart) getParent()).setLayoutConstraint(this, getFigure(), bounds);
}
 

上面的代码在EditPart中,当属性改变时候,就告诉父EditPart,重新调整当前的位置,当然,新的位置信息来自于model。
注意:上面这段代码用于XYLayout的情况下,如果是GridLayout,需要传递GridData对象。其他的Layout也会有其他不同的参数传递和处理。


七. Model如果是父子结构的,EditPart如何知道呢?

/**
* @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren()
*/
protected List<BaseModel> getModelChildren() {
return ((BaseContainerModel) this.getModel()).getChilds();
}

 

就在于上面的代码,如果model有小孩,就将所有的model的小孩返回,那么EditPart就能知道当前的model是否是父子架构的了。

八. 总结
通过上面的内容已经能够明白:model->EditPart->Figure 的属性变化的传递和如何响应。这其实是GEF中模型变化影响UI界面的一条途径。
还有另一条途径就是通过界面操作,产生Request,通过EditPart的EditPolicy生成Command,Command改变model,从而影响界面。这第二条路以后会提到。

 

3
0
分享到:
评论

相关推荐

    GEF学习总结

    GEF 全称 Graphical Editor Framework 。它是一个基于 eclipse 的图形化编辑框架。通过它,开发人员可以方便的以图形化的方式(而非文本的方式)展示和编辑模型。

    GEF学习体会与经验总结(.doc)

    学习GEF的过程中,我参考了很多网上的资源,它们通常涵盖了基础教程、进阶示例以及问题解决方案。通过不断实践,我能更好地理解和应用GEF,解决实际项目中的图形编辑需求。 总的来说,GEF提供了一个强大且灵活的...

    Gef 学习总结

    **Gef 学习总结** Gef,全称为 Graph Editor Framework,是一个强大的图形编辑框架,主要用于构建可视化的图形编辑工具。在IT行业中,Gef通常与EMF(Eclipse Modeling Framework)结合使用,用于创建复杂的建模和...

    GEF研究总结

    【GEF研究总结】 GEF(Graphical Editor Framework)是一个专为开发图形化编辑应用程序的框架,它使得开发者可以通过图形化方式展示和编辑模型,从而提高用户体验。在各种图形化编辑应用中,如UML类图编辑器、XML...

    自己下的GEF资源打包

    描述进一步说明了这个包中包含的具体内容,如“GEF_Tutorial”、“GEF实例”、“入门教程”以及“GEF-whole-upload”,这些都暗示了这是一个全面的学习资源,旨在帮助用户从基础到实践全方位掌握GEF。 GEF,全称为...

    GEF的动态变化二

    标题“GEF的动态变化二”暗示我们正在讨论的是Graph Editor Framework (GEF) 的一个特定方面,特别是关于它的动态性或变化。GEF是一个用于构建图形编辑器的开源Java框架,广泛应用于创建可视化的软件设计工具。在这...

    GEF基础知识

    ### GEF基础知识详解 #### 一、GEF与Draw2D概述 GEF(Graphical Editor Framework)是一款专为Eclipse平台设计的图形编辑框架,主要用于帮助开发者构建复杂的图形界面编辑器,使得用户可以通过直观的图形操作来...

    GEF典型实现例子

    标题“GEF典型实现例子”指的是使用Graphical Editing Framework (GEF)的示例应用。...通过文档和博客文章,你可以逐步了解和实践GEF的使用,从基础知识到高级特性,最终能够运用GEF构建自己的图形编辑工具。

    GEF开发整合资料大全

    3. **社区支持**:Eclipse社区有大量关于GEF的讨论和问题解答,是学习和解决问题的好去处。 4. **开源项目**:查看和研究使用GEF的开源项目,可以从实践中学习其应用。 **开发实践** 在实际开发中,首先要理解模型-...

    GEF简易教程-学习GEF的入门教程

    Windows 2000可能遇到兼容性问题,需额外调试。 - **JDK版本**:推荐使用1.5及以上版本,因低版本在处理EMF中的XML模型时可能出现异常。 - **Eclipse版本**:至少3.1.0。 - **GEF版本**:至少3.1.0,包含Draw2D。 - ...

    GEF教程

    即便是最基础的GEF应用程序,也会涉及到多个包和数十个类,涵盖从模型到视图再到控制器的完整链路。这种结构化的设计,虽然在初始阶段可能会让人感到困惑,但一旦理解其设计理念,就能体会到其在扩展性和灵活性上的...

    IBM GEF 推广资料

    此外,还会提供动手实践的机会,通过“Shapes Example”来让参与者亲身体验GEF的使用,以避免常见错误。 为了参与这个教程,你需要准备: 1. **Eclipse 3.1M5a**:这是开发环境,确保你有这个版本或更高版本的...

    GEF入门学习例子

    7. **文件名称列表**: `gef.tutorial.step2`可能代表了一个逐步教程的第二步,通常包含了一些示例代码和配置文件,用于演示上述概念的实现。 学习这个例子,开发者可以了解如何使用GEF创建一个完整的图形编辑环境,...

    GEF开发实践

    ### GEF开发实践知识点解析 #### 一、GEF向导与工程创建 **1. 创建GEF工程** GEF(Graphical Editing Framework)是Eclipse提供的一个强大的图形编辑框架,适用于构建复杂图形用户界面的应用程序。创建GEF工程是...

    GEF理解系列二

    总结来说,【GEF理解系列二】涵盖了GEF中Editor的初始化和配置,以及如何通过创建多层次模型来支持多个图形的展示。通过实现`initializeGraphicalViewer()`和`configureGraphicalViewer()`,以及自定义`...

    java gef开发实例

    Java GEF(Graphical Editing Framework)开发实例是一个深入理解并应用GEF框架的优秀实践案例。GEF是Eclipse平台上用于构建图形编辑器的库,它提供了构建图形用户界面(GUI)所需的基础结构,尤其适合创建复杂的...

    Eclipse的GEF学习

    #### 二、GEF的关键组件解析 1. **模型(Model)**:模型是应用的核心数据结构,负责存储和管理数据。在GEF中,模型需具备变化通知机制,以便于及时更新控制器和视图。通常,模型的设计应紧密贴合业务逻辑,以确保...

    gef学习文档+学习源码

    首先,让我们了解Gef的基础知识。Gef是用Python编写的,它通过添加新的命令、改进现有命令和提供额外的可视化来增强GDB的功能。Gef的主要目标是为逆向工程师提供一个统一的平台,以便更好地理解二进制代码的行为。它...

    GEF-ALL-3.7+GEF-ALL-3.8+GEF_Draw2d学习资料

    【GEF-ALL-3.7+GEF-ALL-3.8+GEF_Draw2d学习资料】是一份综合性的资源包,包含了GEF(Graphical Editing Framework)的3.7和3.8版本以及与其相关的Draw2D库的学习材料。GEF是Eclipse平台上用于构建图形化编辑器框架的...

    GEF-ALL-3.3.zip

    对于GEF,Eclipse是一个常见选择,因为它有很好的插件支持。 4. **安装Eclipse**:从eclipse.org下载最新稳定版Eclipse IDE,并根据官方指南进行安装。Eclipse是一个开放源码的IDE,广泛用于Java应用的开发。 5. *...

Global site tag (gtag.js) - Google Analytics