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