1

我有一个 EMF 数据模型并用框架“Graphiti”表示它。如果数据模型发生变化,我的 UpdateFeature 中的方法“updateNeeded()”会随机调用或不调用。因此,我有一个听众。如果发生更改,此侦听器将调用方法“update()”。在方法更新中,我可以定义数据模型和图表之间的差异。但是,如果我想向图表添加或更改任何内容,则会引发异常。

有谁知道我如何自动更新图表?

这是我在监听器中的示例代码:

UpdateContext updateContext = new UpdateContext(getDiagram().getChildren().get(0).getGraphicsAlgorithm().getPictogramElement());
IUpdateFeature updateFeature = getFeatureProvider().getUpdateFeature(updateContext);
updateFeature.update(updateContext);

和例外:

!ENTRY org.eclipse.ui 4 0 2013-07-11 13:36:43.886 !MESSAGE 未处理的事件循环异常!STACK 0

org.eclipse.swt.SWTException: 无法执行 runnable (java.lang.IllegalStateException: Cannot modify resource set without a write transaction)

原因:java.lang.IllegalStateException:无法在没有 org.eclipse.emf.transaction.impl.TransactionChangeRecorder.assertWriting 的写入事务的情况下修改资源集

问候,朱莉安

4

1 回答 1

2

在 Graphiti 中,您需要在 EMF 事务中执行对图表的更改。您可以通过执行代码来做到这一点,如下所示:

TransactionalEditingDomain domain = TransactionUtils.getEditingDomain(diagram);
domain.getCommandStack().execute(new RecordingCommand(domain) {
   public void doExecute() {
      UpdateContext updateContext = new UpdateContext(getDiagram().getChildren().get(0).getGraphicsAlgorithm().getPictogramElement());
      IUpdateFeature updateFeature = getFeatureProvider().getUpdateFeature(updateContext);
      updateFeature.update(updateContext);
   }
});

希望这可以帮助

于 2013-07-25T09:06:08.233 回答