如何使用侦听器扩展基于EMF的模型以在GEF编辑器中使用?

时间:2012-03-22 10:32:15

标签: eclipse model-view-controller listener eclipse-emf eclipse-gef

我正在使用 GEF 编辑器和基于 EMF 的模型创建Eclipse RCP。

GEF Book中有关模型的一件事是

  

该模型应通过侦听器广播所有状态更改,以便   视图可以更新,而模型没有任何直接的知识   控制器或视图。

在本书的示例中,每个模型元素类,例如PersonMarriage等(该示例是族谱编辑器),具有添加和删除相应侦听器的方法,例如, Person的是:

public void addPersonListener(PersonListener l) {
    listeners.add(l);
}

public void removePersonListener(PersonListener l) {
    listeners.remove(l);
}

不幸的是,我使用的模型没有这些add/removeListener方法。现在我需要一种方法来扩展模型并实现方法。我不知道从哪里开始,因为我对EMF了解不多。

该模型是基于图形的,因此它具有节点和边(“关系”)。通过调用将元素添加到图表中,例如MyNode node = ExampleFactory.eINSTANCE.createMyNode()并将新节点添加到图表中,例如graph.addMyNode(node)

由于我缺乏关于EMF的知识,我不明白的是模型中的“扩展点”。

模型结构大致如下:

org.example.structure.MyGraph

public interface MyGraph {
...
    MyRelation addMyNode(MyNode sourceMyNode, MyNode targetMyNode, 
        MYTYPE_NAME myRelationType);
...
}

然后还有一个班级MyGraphImpl

org.example.structure.impl.MyGraphImpl

public class MyGraphImpl extends Graph implements MyGraph {
...
protected MyGraphImpl() {
    super();
    this.init();
}
...
private void init()
{
    //creates indexes
}
...
@Override
public void addMyNode(MyNode myNode) 
{
    super.addNode(myNode);
}
...
}

我是否必须 - 为了缺乏知识而这样做 - 使用EMF扩展单个模型类(如Lars Vogel's website所述),或者我可以扩展模型“每手”?

而且:我是否必须扩展模型的**interface**(例如MyGraph)或其实现(例如MyGraphImpl) ?

我会非常感谢任何正确方向的指示......

谢谢!

2 个答案:

答案 0 :(得分:2)

EMF有自己的通知机制,没有必要添加另一个监听器机制,快速谷歌搜索给了我另一个tutorial Lars带有一个很好的例子来演示这种机制

答案 1 :(得分:0)

一起使用EMF和GEF有很少甚至没有的原因。如果您使用EMF进行建模并使用GEF作为编辑框架,则应考虑使用GMF http://www.eclipse.org/modeling/gmp/。 GMF提供了Draw2D,GEF和EMF的扩展,可以无缝地粘合在一起。如果您只是使用Graphity作为一个更容易的框架构建节点和边缘,那么EMF的GEF将很快为您提供快速而美观的结果。