【问题标题】:How to pass an object from one part to another part in Eclispe e4 RCP?如何在 Eclipse e4 RCP 中将对象从一个部分传递到另一部分?
【发布时间】:2015-07-31 10:01:47
【问题描述】:

我正在使用 eclipse e4 RCP 构建应用程序。我有一个导航器(类似于 Eclipse IDE 中的导航器),我想将它链接到编辑器(类似于 Eclipse IDE 中导航器中的文件如何链接到编辑器)。目前,当用户双击导航器树中的文件时,我正在使用 EPartService 打开我的编辑器部件(通过创建新实例)。但我想向它传递一个参数(字符串或对象),让它知道要在编辑器中打开哪个文件。我希望能够为导航树的不同节点打开多个编辑器。我在互联网上做了很多研究,但找不到解决方案。我认为这是一个常见的问题,e4 框架应该提供一种机制来将这些参数从一个 Part 传递到另一个 Part。当前代码如下:

viewer.addDoubleClickListener(event -> {
        final IStructuredSelection selection = (IStructuredSelection) event.getSelection();
        FileNode file = null;
        boolean partExists = false;
        if (selection.getFirstElement() instanceof FileNode ) {
            file = (FileNode ) selection.getFirstElement();
            for (MPart part1 : partService.getParts()) {
                if (part1.getLabel().equals(file.getName())) {

                    partService.showPart(part1, PartState.ACTIVATE);
                    partExists = true;
                    break;
                }
            }
            if (!partExists) {
                MPart part2 = partService
                        .createPart("com.parts.partdescriptor.fileeditor");
                part2.setLabel(file.getName());
                partService.showPart(part2, PartState.ACTIVATE);
            }
        }
    });

是否可以这样说 part2.setParameter("PARAM_NAME", "FILE_NAME"); ?

【问题讨论】:

    标签: eclipse eclipse-rcp e4


    【解决方案1】:

    当您有MPart 时,您可以致电:

    MPart mpart = ...
    
    MyClass myClass = (MyClass)mpart.getObject();
    

    获取部件的类(Application.e4xmi 中部件的“类 URI”中定义的类)。然后,您可以调用您在零件类中定义的任何方法。

    您还可以在零件的“瞬态数据”区域设置数据:

    mpart.getTransientData().put("key", "data");
    
    Object data = mpart.getTransientData().get("key");
    

    【讨论】:

    • 感谢您的快速回复。我想补充一点,getObject() 方法只在渲染部件后返回非空值。因此,如果我想传输要在编辑器中呈现的数据,例如文本字段中的文件名,然后将其创建为空,然后我必须稍后在通过 getObject() 检索的 mpart 对象上调用的方法中设置文本。在这种情况下,使用“瞬态数据”可能会更好。哪种方法更好的“瞬态数据”或“getObject”?或者它们是相同的,这取决于情况?
    • 如果你想在渲染之前设置一些东西,请使用瞬态数据。这就是我在启动编辑器部件时所做的。
    • 我正在使用以下代码来获取我放入瞬态数据的对象(来自另一部分)。这是正确的吗? MPart 部分 = partService.getActivePart(); Object object = part.getTransientData().get(Constants.INPUT_KEY);是partService.getActivePart();像零件类的“this”一样?
    • 通常你只需要在你的类中注入 MPart。
    猜你喜欢
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 2020-09-22
    • 2023-01-17
    相关资源
    最近更新 更多