【问题标题】:How to close a ViewPart in Eclipse?如何在 Eclipse 中关闭 ViewPart?
【发布时间】:2018-02-14 18:43:06
【问题描述】:

我在 Eclipse 中有一个需要关闭的视图(由扩展 org.eclipse.ui.part.ViewPart 的类实现)。我的意思是完全关闭,而不仅仅是隐藏。我希望在用户(或我的代码)要求再次打开视图时创建一个新的 ViewPart 实例。

我发现的唯一方法是IWorkbenchPage.hideView,它隐藏了视图,但并没有完全消除它。在视图上调用dispose 也没有影响。

顺便说一句,我的视图被定义为allowMultiple="false",但我尝试使用true 并没有任何区别。

我们将不胜感激。

【问题讨论】:

标签: eclipse


【解决方案1】:

我最终发现了问题。如果视图在多个视角上打开,在一个视角上隐藏它不会关闭它。可以遍历所有打开的透视图并寻找视图。从所有角度隐藏它会关闭它。

【讨论】:

  • 如何迭代在所有视角中打开的所有视图?
【解决方案2】:

我认为您提到的IWorkbenchPage.hideView() 方法是唯一可用于以编程方式关闭视图的方法。我也认为这个方法名称应该是 closeView() 因为它真的关闭了视图。

我一直在使用这种方法一段时间(使用allowMultiple=true 视图),经过调试,似乎每次调用hideView() 时都会调用我的view.dispose() 方法。

下次我再次打开此视图时(我的意思是从我的代码而不是从用户界面),Eclipse 会创建一个新视图,并再次调用 createPartControl() 方法。

此外,调用层次结构视图告诉我,hideView() 应该调用 dispose method() ....

hideView() >> releaseView() >> partRemoved() >> disposePart() >> dispose() >> doDisposePart() >> doDisposePart() >> dispose()

希望这可以帮助....

最后一个问题,你是如何检查你的视图没有被正确处理的??

【讨论】:

  • 我的问题不在于处理视图,而在于它的创建。在某些时候,我不得不完全关闭视图并打开一个新实例。我的指示只是视图 createPartControl 方法中的一个断点。这似乎是一个从 Eclipse 3.5 开始的新问题(我在 OS X 上,不确定其他平台)。以前工作得很好。处置也没有发生。我只是想知道在打开错误之前是否还有其他方法。
【解决方案3】:

org.eclipse.ui.internal.ViewFactory 有一个名为 releaseView 的方法,我认为它可以完全关闭视图(虽然我不确定)。它需要一个 IViewReference。

你可以通过调用 Perspective.getViewFactory 来访问 ViewFactory,你可以访问 Perspective,然后传递一个 IViewReference 来释放视图。

IWorkbenchPage page = 
Workbench.getInstance().getActiveWorkbenchWindow().getActivePage()

Perspective perspective = page.getPerspective();

String viewId = "myViewId"; //defined by you

//get the reference for your viewId
IViewReference ref = page.findViewReference(viewId);

//release the view
perspective.getViewFactory.releaseView(ref);

【讨论】:

  • 从 hideView 调用 releaseView 方法。因此我认为不需要调用它。
【解决方案4】:

我重写了 IWorkbenchPart 中的 dispose 方法,并且该方法有效。 我在重写的 dispose 方法中有类似的东西:

public void dispose() {
    super.dispose();
    IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
    if (page != null) {
        IViewReference[] viewReferences = page.getViewReferences();
        for (IViewReference ivr : viewReferences) {
            if (ivr.getId().equalsIgnoreCase("your view id")
                    || ivr.getId().equalsIgnoreCase("more view id if you want to close more than one at a time")) {
                page.hideView(ivr);
            }
        }
    }
}

【讨论】:

    【解决方案5】:

    为了在关闭 Perspective 时处理 ViewPart,我们使用了以下代码:

    IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
    if (workbenchWindow != null) {
        workbenchWindow.addPerspectiveListener(new PerspectiveAdapter() {
            @Override
            public void perspectiveActivated(IWorkbenchPage page,
                    IPerspectiveDescriptor perspectiveDescriptor) {
                super.perspectiveActivated(page, perspectiveDescriptor);
            }
            @Override
            public void perspectiveDeactivated(IWorkbenchPage page,
                    IPerspectiveDescriptor perspective) {
                super.perspectiveDeactivated(page, perspective);
                page.closePerspective(perspective, false, true);
            }
        });
    }
    

    page.closePerspective(perspective, false, true); 的结果中,在透视图中打开的 ViewPart 将被释放。

    【讨论】:

      【解决方案6】:

      为了关闭以不同视角打开的视图,我覆盖了 org.eclipse.ui.PerspectiveAdapter 的 perspectiveDeactivated()。

      public void perspectiveDeactivated(IWorkbenchPage page,
              IPerspectiveDescriptor perspective) {
          super.perspectiveDeactivated(page, perspective);
          boolean myPerspective = MyPerspective.PERSPECTIVE_ID.equals(perspective.getId());
          if(!myPerspective) {
              //close Error Log view if it is opened in any perspective except My perspective. 
              IViewPart errorView = page.findView("org.eclipse.pde.runtime.LogView");
              if(errorView != null) {
                  page.hideView(errorView);
              }
          }
      }
      

      我的要求是关闭“错误日志”视图。上面的代码可以修改关闭任何视图。

      【讨论】:

        猜你喜欢
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多