代码之家  ›  专栏  ›  技术社区  ›  zvikico

如何在Eclipse中关闭视图部件?

  •  9
  • zvikico  · 技术社区  · 15 年前

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

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

    顺便说一句,我的视图定义为 allowMultiple="false" 但我尝试过 true 这没什么区别。

    如有任何帮助,我们将不胜感激。

    6 回复  |  直到 6 年前
        1
  •  8
  •   zvikico    15 年前

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

        2
  •  3
  •   Lii Martin Sansone - MiOEE    6 年前

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

    我用这种方法已经有一段时间了 allowMultiple=true 视图)调试后 view.dispose() 每次调用时都调用方法 hideView() .

    下次我再次打开这个视图(我的意思是从我的代码而不是从用户界面),Eclipse和 createPartControl() 方法被再次调用。

    此外,调用层次视图告诉我 HIDEVIEW() 应该调用Dispose method()

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

    希望这能有所帮助…

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

        3
  •  0
  •   Rich Seller    15 年前

    org.eclipse.ui.internal.viewFactory有一个名为releaseView的方法,我认为它完全关闭了视图(尽管我不确定)。它需要一个IviewReference。

    您可以通过调用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);
    
        4
  •  0
  •   Manglesh    11 年前

    我重写了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
  •  0
  •   vabank    9 年前

    为了在关闭透视图上释放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
  •  0
  •   Priyadarshini    8 年前

    为了关闭在不同透视图中打开的视图,我重写了org.eclipse.ui.perspectiveadapter的perspectiveedeactivated()。

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

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