如何关闭Eclipse中的ViewPart?

时间:2009-08-04 11:54:44

标签: eclipse

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

我找到的唯一方法是隐藏视图的IWorkbenchPage.hideView,但没有完全处理它。在视图上调用dispose也没有任何影响。

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

任何帮助将不胜感激。

6 个答案:

答案 0 :(得分:8)

我最终发现了这个问题。如果视图在多个透视图上打开,则将其隐藏在一个透视图上将不会将其关闭。可以迭代所有打开的透视图并查找视图。在所有观点上隐藏它将会关闭它。

答案 1 :(得分:3)

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

我一直在使用此方法(使用allowMultiple=true个视图)并且在调试之后,每次调用view.dispose()时都会调用hideView()方法。

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

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

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

希望这可以帮助......

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

答案 2 :(得分:0)

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);

答案 3 :(得分:0)

我从IWorkbenchPart覆盖了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);
            }
        }
    }
}

答案 4 :(得分:0)

为了在关闭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将被处理。

答案 5 :(得分:0)

为了关闭视图,以不同的视角打开,我重写了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);
        }
    }
}

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