【问题标题】:Eclipse RCP: clonePerspective returns nullEclipse RCP:clonePerspective 返回 null
【发布时间】:2014-12-10 15:58:22
【问题描述】:

我想克隆一个透视图并保存克隆的透视图。但是,对 PerspectiveRegistry.clonePerspective(...) 的调用返回 null,我想不出我的参数值可能有什么问题。

public void savePerspectiveAs(String label) {
    IWorkbenchPage page = PlatformUI.getWorkbench()
            .getActiveWorkbenchWindow().getActivePage();
    IPerspectiveDescriptor perspectiveDescriptor = perspectiveRegistry
            .findPerspectiveWithLabel(label);

    // if the perspective doesn't exist, create a new one 
    // by cloning the current perspective
    if (perspectiveDescriptor == null) {
        IPerspectiveDescriptor currentPerspectiveDescriptor = 
                perspectiveRegistry.findPerspectiveWithId(currentPerspective);
        // after this line, perspectiveDescriptor is still null
        perspectiveDescriptor = perspectiveRegistry
                .clonePerspective(currentPerspective + "." 
                         + label.replaceAll(" ", "_"), label, 
                         currentPerspectiveDescriptor);
        // hence I get a NullPointerException here...
        connectedPerspectives.add(perspectiveDescriptor.getId());
    }
    page.savePerspectiveAs(perspectiveDescriptor);

}

所有其他值似乎都很好。 currentPerspectiveDescriptor 是一个有效对象,perspectiveRegistry 也是如此。

label 类似于"Connected Perspective 2"。它还不存在,我创建的透视 ID 也不存在。

有什么想法吗? clonePerspective(...) 返回 null 会出现什么问题?

【问题讨论】:

    标签: java eclipse eclipse-rcp perspective


    【解决方案1】:

    clonePerspective 在 Eclipse 4.x 中不受支持。

    这是PerspectiveRegistry.clonePerspective的代码:

    public IPerspectiveDescriptor clonePerspective(String id, String label,
            IPerspectiveDescriptor desc) throws IllegalArgumentException {
        // FIXME: compat clonePerspective. Not called in 3.8
        E4Util.unsupported("clonePerspective"); //$NON-NLS-1$
        return null;
    }
    

    这个问题的 Eclipse 错误是 382209

    【讨论】:

    • 而不是抛出异常,而是默默地记录它 - 多么卑鄙!有什么办法可以解决这个问题,还是我们必须等待错误修复?
    • 该错误已存在两年多,因此不太可能很快修复。您可能可以使用 Eclipse e4 EModelService、EPartService 来做一些事情……我个人没有看过 e4 中的透视图。
    • 仅供参考:我问过他们,他们告诉我他们不打算在下一个版本中解决这个错误。
    【解决方案2】:

    我能够在不为 e4 重写所有内容的情况下为“克隆”视角制定解决方法。然而,这是一个相当肮脏的 hack,我不推荐它,因为它对 Eclipse 的实现类而不是它的接口使用未经检查的强制转换。

    @SuppressWarnings("restriction")
    public void savePerspectiveAs(String label) {
        IWorkbenchPage page = PlatformUI.getWorkbench()
                .getActiveWorkbenchWindow().getActivePage();
        IPerspectiveDescriptor perspectiveDescriptor = perspectiveRegistry
                .findPerspectiveWithLabel(label);
    
        // if the perspective doesn't exist, create a new one 
        // by cloning the current perspective
        if (perspectiveDescriptor == null) {
            // Note: this is a dirty hack.
            // It is not recommended to cast to PerspectiveDescriptor 
            // or PerspectiveRegistry.
            PerspectiveDescriptor currentPerspectiveDescriptor =
                    (PerspectiveDescriptor) perspectiveRegistry.findPerspectiveWithId(currentPerspective);
            perspectiveDescriptor =
                    ((PerspectiveRegistry) perspectiveRegistry)
                            .createPerspective(label, currentPerspectiveDescriptor);
            connectedPerspectives.add(perspectiveDescriptor.getId());
        }
    
        page.savePerspectiveAs(perspectiveDescriptor);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多