4

我有一个 EMF 模型和生成的编辑器。在模型/编辑器中,可以将元素“Unit”(U) 与“Specification”(S) 连接起来。现在,如果至少有一个 U 满足 S,我想为 S 提供一种专门的 CSS 样式。但是(据我所知)没有办法在 CSS 样式表中实现这一点(例如,使用选择器)纸莎草纸。

为此,我为 S 添加了一个额外的属性,称为“映射”(当至少有一个 U 满足 S 时应该为真,否则为假)。然后,当添加一个/多个连接时(在handleNotification - 方法中),我尝试在代码中设置“映射”属性:

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 文件识别“映射”属性的变化。

非常感谢 :)

4

2 回答 2

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();
    }
}
于 2013-10-16T12:50:18.883 回答
-1

您确实需要使用事务 API 在 EMF 中进行更改。对模型所做的所有更改都应使用命令完成。

看看 API

于 2014-04-16T16:26:57.210 回答