Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Eclipse建模框架:将替代视图链接到模型_Eclipse_Jface_Eclipse Emf - Fatal编程技术网

Eclipse建模框架:将替代视图链接到模型

Eclipse建模框架:将替代视图链接到模型,eclipse,jface,eclipse-emf,Eclipse,Jface,Eclipse Emf,我使用了一个ECore模型来自动生成模型源和JFace编辑包。我正在尝试为该模型的内容开发另一种视图,基本上是基于JFreeChart的图形视图。我已经创建了一个基于JFreeChart的视图插件。现在我需要将视图与模型链接起来。我该怎么做?我想用树状编辑器编辑模型,并在图形视图中查看这种编辑的效果。可能吗 谢谢是的,因为生成的EMF代码提供了一个通知层:使用EObject.eAdapters添加一个新适配器,如果模型发生更改,就会通知该适配器 object.eAdapters().ad

我使用了一个ECore模型来自动生成模型源和JFace编辑包。我正在尝试为该模型的内容开发另一种视图,基本上是基于JFreeChart的图形视图。我已经创建了一个基于JFreeChart的视图插件。现在我需要将视图与模型链接起来。我该怎么做?我想用树状编辑器编辑模型,并在图形视图中查看这种编辑的效果。可能吗


谢谢

是的,因为生成的EMF代码提供了一个通知层:使用EObject.eAdapters添加一个新适配器,如果模型发生更改,就会通知该适配器

    object.eAdapters().add(new Adapter() {

        public void setTarget(Notifier newTarget) {
            // TODO Auto-generated method stub

        }

        public void notifyChanged(Notification notification) {
            // TODO Auto-generated method stub

        }

        public boolean isAdapterForType(Object type) {
            // TODO Auto-generated method stub
            return false;
        }

        public Notifier getTarget() {
            // TODO Auto-generated method stub
            return null;
        }
    });

如果打开基于图形的视图,请询问当前打开的编辑器的IFile。获取文件后,如果EMF模型的基础IFile发生更改,可以加载模型(请参阅生成的编辑器如何从基础资源加载模型)附加IResourceChangeListener以获取通知。 发出通知后,可以从文件中重新加载模型,并在视图中显示模型


此外,如果用户将另一个emf编辑器置于顶部或关闭编辑器(您还必须卸载(关闭时)或刷新(另一个带有emf模型的编辑器置于顶部),则必须注册PartListener以获得通知.

好的,我已经按照佐尔坦的建议做到了。无论如何,我承认我更喜欢一个更有条理的答案,这就是为什么我用解决方案的简要总结来回答我自己的问题

基本上,视图插件实现了ViewPart接口

getSite().getWorkbenchWindow().getSelectionService()
为了获得工作台选择服务,您可以调用SelectionService方法

addSelectionListener(ISelectionListener listener)
作为参数传递您自己的ISelectionListener,它可以是您正在实现的同一个ViewPart。您只需实现ISelectionListener接口,从而提供selectionChanged方法的实现

public void selectionChanged(IWorkbenchPart sourcepart, ISelection selection)

嗯……ecore模型的实时更改将如何以这种方式反映在图表中?使用选择服务获取当前选定的
emodelement
,获取模型根-
EPackage
,添加内容适配器(如果不存在),然后更新图表不是更好吗?如果要可视化实时更新,可以。使用Re源监听器仅当保存编辑器时,图表才会刷新。但直接在模型上进行监听还有其他缺点(例如,如果用户希望使用替代模型查看器).选择服务没有用处,如果我在我的包查看器中选择一个元素,而编辑器和视图保持打开状态,该怎么办?使用什么取决于要求和模型(例如,模型与其他模型交叉引用等)我同意。这取决于需求。当我使用selection listener时,我经常测试当前的selection owner,以仅更新相关更改的视图……我实际上是从默认编辑器打开该文件。我只想提供其内容的进一步视图。我的问题是如何获得对我的模型的引用/或注册我的视图作为其更改的侦听器?我应该向哪个对象添加适配器?我猜是模型,但如何从视图插件获取对它的引用?(谢谢)正如Tom Seidel在另一个答案中所写的那样,您可以使用工作台侦听器来回复编辑器的打开,然后获取其打开的文件;您还可以侦听工作台选择API,并以这种方式获取对模型的引用。在这两种方式中,都可以获取模型的根元素,并使用以下内容:谢谢大家的帮助。我我不知道如何添加这样的选择侦听器。我的意思是,我已经在我的视图插件中导入了ModelPackage,似乎我可以获得它的一个实例,因为它是一个单例。但是,它似乎只允许我深入元模型而不是模型。你不能使用ModelPackage打开实例模型。你可以使用ModelFac创建自己的实例模型tory类;您可以使用Resource/ResourceSet API打开一个;或者您可以使用平台选择API(独立于EMF)从当前编辑器获取所选对象。我明白了。但是我应该如何使用选择API?我应该注册到哪个对象?