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