【问题标题】:How to extend an EMF-based model with listeners for use in a GEF editor?如何使用侦听器扩展基于 EMF 的模型以在 GEF 编辑器中使用?
【发布时间】:2012-04-06 21:50:09
【问题描述】:

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

GEF Book 中提到的关于模型的一件事是

模型应该通过 listeners 广播所有状态变化,以便 可以在模型没有任何直接知识的情况下更新视图 控制器或视图。

在本书的示例中,每个模型元素类,例如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**s(例如MyGraph),或者它们的实现(例如MyGraphImpl)?

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

    EMF 有自己的通知机制,无需添加另一个侦听器机制,快速 google-search 给了我另一个 Lars 的 tutorial 并有一个很好的例子来演示这个机制

    【讨论】:

    • 谢谢!我当然在这里问之前用谷歌搜索了一下,但由于缺乏关于 EMF 的知识,我似乎不知道要寻找什么。我会好好看看 tut,看看这是否能让我到任何地方......
    • 嗯,如果模型本身不包含任何Observers,我是否可以自己创建它们而无需更改模型本身?我不确定我是否正确理解了本教程...谢谢(也感谢新手的耐心)!
    • 好的,我在 eclipse.org (eclipse.org/articles/Article-GEF-EMF/gef-emf.html) 上找到了另一个教程,它涉及将 GEF 和 EMF 结合在一起。我会详细检查一下。
    • 是的,看起来不错。您还可以在那里找到“聆听您的 EMF 模型”部分,其中包含有关通知器的 sn-p,
    【解决方案2】:

    几乎没有理由同时使用 EMF 和 GEF。如果您在 EMF 中建模并使用 GEF 作为编辑框架,您应该考虑使用 GMF http://www.eclipse.org/modeling/gmp/ insted。 GMF 提供了 Draw2D、GEF 和 EMF 的扩展,将它们无缝地粘合在一起。如果您只是构建节点和边,请考虑使用 Graphity 作为一个更简单的框架,然后使用 EMF 的 GEF,它会很快为您提供快速和良好的结果。

    【讨论】:

    • 谢谢。我最近看过 Graphiti 和 Spray,一定会尝试一下。
    猜你喜欢
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    相关资源
    最近更新 更多