如何在Eclipse中关闭ViewPart?

如何在Eclipse中关闭ViewPart?,eclipse,Eclipse,我在Eclipse中有一个视图(由一个扩展了org.Eclipse.ui.part.ViewPart的类实现),我需要关闭它。我的意思是完全接近,而不仅仅是隐藏。我希望在用户(或我的代码)要求再次打开视图时创建新的ViewPart实例 我找到的唯一方法是IWorkbenchPage.hideView,它隐藏了视图,但没有完全处理它。在视图上调用dispose也没有影响 顺便说一句,我的视图被定义为allowMultiple=“false”,但我尝试了true,这没有任何区别 任何帮助都将不胜感激

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

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

顺便说一句,我的视图被定义为
allowMultiple=“false”
,但我尝试了
true
,这没有任何区别


任何帮助都将不胜感激。

org.eclipse.ui.internal.ViewFactory有一个名为releaseView的方法,我想它会完全关闭视图(尽管我不确定)。这需要一次非正式的会议

可以通过调用Perspective.getViewFactory访问ViewFactory,然后可以访问该透视图,然后向其传递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);

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

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);
我已经使用此方法一段时间了(使用
allowMultiple=true
视图),调试后,似乎每次调用
hideView()
时都会调用我的
view.dispose()
方法

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

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

hideView() >> releaseView() >> partRemoved() >> disposePart() >> dispose() >> doDisposePart() >> doDisposePart() >> dispose()
希望这能帮助


最后一个问题,您是如何检查您的视图未正确处理的???

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

我从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);
            }
        }
    }
}

为了在关闭透视图上处理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的结果中(透视、假、真),在透视图中打开的ViewPart,将被释放。

要关闭在不同透视图中打开的视图,我覆盖了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);
        }
    }
}

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

从hideView的方法调用releaseView方法。因此,我认为不需要调用它。我的问题不是处理视图,而是它的“创建”。在某个时刻,我不得不完全关闭视图并打开一个新实例。我的指示只是视图createPartControl方法中的一个断点。这似乎是从Eclipse3.5开始出现的一个新问题(我使用的是OSX,对于其他平台不太确定)。以前工作得很好。这种情况也没有发生。我只是想知道在打开bug之前是否还有其他方法。打开Cocoa/SWT的一个缺陷:如何迭代所有透视图中打开的所有视图?