我有一个EMF模型和生成的编辑器。在模型/编辑器中,可以将元素“单元”(U)与“规范”(S)连接。现在,如果至少有一个U满足S,我希望有一个专门的CSS样式。但是(据我所知),在CSS-Stylesheet中没有办法实现这个(例如使用Selectors)纸莎草。
出于这个原因,我为S增加了一个名为“Mapped”的属性(当至少有一个U满足S时应该是真的,否则它是假的)。然后,我尝试在添加一个/多个连接时(在handleNotification - Method中)设置代码中的“Mapped”-Property:
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-File识别“Mapped”-Property的变化。
非常感谢:)
答案 0 :(得分:3)
找到解决我问题的方法:
低音词似乎是异步的......
要按照以下方式成功更改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();
}
}
答案 1 :(得分:-1)
您需要使用事务API在EMF中进行更改。所有 应使用命令对模型进行更改。