2009-08-04 115 views
9

我在Eclipse中有一個視圖(由一個擴展了org.eclipse.ui.part.ViewPart的類實現),我需要關閉它。我的意思是完全接近,而不是隱藏。當用戶(或我的代碼)要求再次打開視圖時,我想要創建一個新的ViewPart實例。如何在Eclipse中關閉ViewPart?

我發現的唯一方法是IWorkbenchPage.hideView它隱藏了視圖,但沒有完全處理它。在視圖上調用dispose也沒有任何影響。

順便說一句,我的看法被定義爲allowMultiple="false",但我嘗試與true,並沒有任何區別。

任何幫助將不勝感激。

+0

打開Cocoa/SWT的缺陷:https://bugs.eclipse.org/bugs/show_bug.cgi?id=286373 – zvikico 2009-08-12 10:45:28

回答

8

我最終發現了這個問題。如果視圖以多個視角打開,則將視圖隱藏在一個視角上不會關閉它。可以遍歷所有開放視角並查找視圖。隱藏它的所有觀點將關閉它。

+0

如何遍歷所有視圖中打開的所有視圖? – Lii 2018-02-14 10:39:09

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

releaseView方法是從hideView的方法調用的。因此我認爲這不是必須的。 – 2009-08-04 12:44:29

3

我想你提到的IWorkbenchPage.hideView()方法可用於programmaticaly關閉視圖中的唯一一個。我也認爲這個方法的名字應該是closeView(),因爲它真的關閉了視圖。

我一直在使用了一段時間這種方法(與allowMultiple=true意見)和調試之後,似乎我的view.dispose()方法每天我調用hideView()時調用。

下一次我再次打開此視圖(我的意思是從我的代碼而不是從用戶界面),Eclipse創建一個新的視圖並再次調用createPartControl()方法。

此外,調用層次視圖告訴我比hideView()應該調用Dispose method() ....

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

希望這可以幫助....

最後一個問題,你是怎麼檢查你的觀點沒有正確處理?

+0

我的問題不是處理視圖,而是處理其創作。在某些時候,我必須完全關閉視圖並打開一個新的實例。我的指示只是視圖createPartControl方法中的一個斷點。這似乎是從Eclipse 3.5開始的一個新問題(我在OS X上,不確定其他平臺)。之前工作得很好。處置也沒有發生。我只是想知道在打開一個bug之前是否有另一種方法。 – zvikico 2009-08-04 13:51:11

+0

好的。我現在明白了; o) – 2009-08-04 14:02:35

0

我重寫了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); 
      } 
     } 
    } 
} 
0

爲了處置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時這是內打開視角,將被處置。

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

我的要求是關閉「錯誤日誌」視圖。以上代碼可以修改爲關閉任何視圖。