1

GEF エディターと EMF ベースのモデルとの同期に問題があります。notifyChanged()これは、モデル内部の EMF アダプター、またはそれが呼び出すメソッドが、エディターのアダプターが呼び出されてモデルの子を更新する前に終了していないためだと思います。これにより、エディター ビューがモデル自体と同期しなくなるか、モデルへの変更がビューに表示されるべきときに表示されなくなります。

この設定を検討してください。" 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;
}
4

2 に答える 2

1

(サードパーティの)モデルをデバッグしたところ、実際の追加が行われる前にGraph'が通知を起動したため、ノードが追加される前に通知を受け取るのが早すぎたことがわかりました。enotify()Adapter

追加後に通知が呼び出されるようになり、すべてが正常に機能します。

助けてくれてありがとう!

于 2012-09-11T10:51:50.247 に答える
0

AdapterImpl の代わりに EContentAdapter を拡張してみてください。呼び出すことを忘れないでください。

super.notifyChanged(Notification notification);

初期化。これはアダプターであり、モデルの新しい要素に自身を追加し、それらが変更されたことを通知します。

于 2012-08-22T08:51:43.437 に答える