我无法将 GEF 编辑器与基于 EMF 的模型同步。我认为这是因为模型内部的 EMF 适配器,或者更确切地说是它调用的方法,在调用编辑器的适配器notifyChanged()
并更新模型子节点之前没有完成。这导致编辑器视图与模型本身不同步,或者更确切地说,模型的更改没有在视图中显示,而它们应该显示在视图中。
考虑这个设置。一个Command
" CreateNodeCommand
" 向底层模型添加一个节点:
@Override
public void execute() {
...
getNewNode().setGraph(getGraph());
...
}
有GraphEditPart
一个内部类扩展org.eclipse.emf.common.notify.Adapter
。它的notifyChanged()
方法确实被通知了,测试类似于下面(不完整的代码):
@Override
public void notifyChanged(Notification notification) {
switch (notification.getEventType()) {
case Notification.ADD:
System.err.println("ADD occurred!");
refreshChildren();
}
问题是,(第三方)模型本身也实现了一个Adapter
,它又在新的模型元素上运行许多方法,例如添加一个 ID 等。
在我看来,新元素的图形在创建后并没有直接出现在编辑器中这一事实 - 但只有在下一个编辑步骤之后,然后没有出现的图形 - 表明模型适配器是仍在忙于设置新元素,而编辑器适配器refreshChildren()
已经在调用它。
这似乎需要同步,但我不确定这是否可以通过用于多线程的内置 Java 功能或调用基于 EMF 的方法来实现。
请分享您在 EMF 中同步的知识。
提前谢谢了!
编辑
根据要求,这是该getModelChildren()
方法的源代码:
@Override
protected List<EObject> getModelChildren() {
List<EObject> allModelObjects = new ArrayList<EObject>();
allModelObjects.addAll(((MyGraph) getModel()).getTokens());
allModelObjects.addAll(((MyGraph) getModel()).getNodes());
return allModelObjects;
}