У меня возникли проблемы с синхронизацией моего редактора 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
, который, в свою очередь, запускает ряд методов для нового элемента модели, таких как добавление идентификатора и т. д.
Мне кажется, что тот факт, что фигура нового элемента не появляется в редакторе сразу после его создания, а только после следующего шага редактирования, фигура которого потом не появляется, говорит о том, что адаптер модели все еще занят настройкой нового элемента, в то время как refreshChildren()
уже вызывается адаптером editor.
Похоже, это требует синхронизации, но я не уверен, можно ли этого добиться с помощью встроенных функций 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;
}
Adapter
для прослушивания изменений внутри себя. Кажется, моя проблема заключается в том, чтоAdapter
, который я использую в своем редакторе, уведомляется до того, как действия, вызванные внутреннимAdapter
модели, завершатся, поэтому элемент, похоже, был создан, но (я думаю) еще не добавлен внутри модели в список, который я использую дляgetChildren()
. - person s.d   schedule 27.08.2012ADD
. По крайней мере, я получаю стандартное сообщение. Я предполагаю, что метод модели должен сначала добавить элемент, затем изменить его (?) по мере необходимости, а затем добавить его в список элементов, которые вызываетgetModelChildren()
. - person s.d   schedule 28.08.2012getModelChildren
? Если модель генерируется из EMF, то нет возможности, чтобы дочерние элементы не находились в модели, когда вы уведомлены. - person vainolo   schedule 29.08.2012setGraph
из сгенерированного кода? Я прочитал сгенерированный код, который у меня есть, используя EMF, и уведомления отправляются только ПОСЛЕ того, как все изменения в модели внесены. Я думаю, вам понадобится очень долгий сеанс отладки, чтобы понять, что происходит :-( - person vainolo   schedule 30.08.2012