EMF/GMF/Papyrus - 将 ElementImpl - 属性设置为代码外



我有一个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

相关内容

  • 没有找到相关文章

最新更新