我有一个EMF模型和生成的编辑器。在模型/编辑器中,可以将元素"单位"(U(与"规范"(S(连接起来。现在,如果至少有一个 U 满足 S,我想为 S 提供一个专门的 CSS 样式。但是(据我所知(没有办法在 Papyrus 的 CSS 样式表中完成此操作(例如使用选择器(。
出于这个原因,我为 S 添加了一个额外的属性,称为"Mapped"(当至少一个 U 满足 S 时,应该是真的,否则它是假的(。然后,我尝试在代码中设置"Mapped"属性,当添加一个或多个连接时(在句柄通知 - 方法中(:
notifier.setMapped(true);
除外:
IllegalstateException: Cannot modify resource set without a write transaction
第二个解决方案导致了另一个异常,但具有相同的语义结果:
ed.getCommandStack().execute(SetCommand.create(ed, notifier,
xyzPackage.Literals.SPECIFICATION__MAPPED, true));
但以下情况除外:
java.lang.IllegalStateException: Cannot activate read/write
transaction in read-only transaction context
有谁知道如何处理这些异常或有一个很好的解决方法?主要目的是CSS文件识别"映射"属性的更改。
非常感谢:)
找到了我的问题的解决方案:
低音剑似乎是异步的...
要成功更改以下EObjects
的属性,我必须执行以下操作:
public void SpecificationEditPart.handleNotification(Notification event)
{
EObject eObject = (EObject)event.getNotifier();
SpecificationImpl notifier = (SpecificationImpl)eObject;
EList<Satisfy> satisfyRelationList = notifier.getIncoming();
int satisfyRelationListSize = satisfyRelationList.size();
TransactionalEditingDomain ted = (TransactionalEditingDomain)AdapterFactoryEditingDomain.getEditingDomainFor(eObject);
try
{
ted.runExclusive(new Runnable()
{
public void run ()
{
Display display = PlatformUI.getWorkbench().getDisplay();
display.asyncExec(new Runnable()
{
public void run ()
{
ted.getCommandStack().execute(new SetCommand(this.ted, notifier, xxxPackage.Literals.SPECIFICATION__MAPPED, true));
}
});
}
});
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
您确实需要使用事务 API 在 EMF 中进行更改。都对模型所做的更改应使用命令完成。
看看 API