2011-07-16 113 views
3

我創建了一個簡單的Eclipse RCP應用程序,我可以根據用戶操作打開多個編輯器實例。我有一個單獨的視圖(ViewPart),我在這裏監聽編輯器上的選擇更改。 問題是,視圖只會通知上次打開的編輯器的選擇,其他先前打開的編輯器不再提供事件/或者視圖只能監聽上次打開的編輯器,而沒有其他任何內容。即使先前開放的編輯者獲得關注,也會發生這種情況。Eclipse RCP - 如何從焦點編輯器中偵聽選擇

換句話說,只有編輯器區域中最新的編輯器提供了選擇事件,我想要的是,當我點擊其他編輯器的選項卡時,我想查看當前點擊之前打開的視圖上的更改編輯。

我認爲我使用:

IWorkbench workbench = PlatformUI.getWorkbench(); 
     workbench.getActiveWorkbenchWindow().getActivePage().addSelectionListener(DocumentsEditor.ID,(ISelectionListener)this); 

其中DocumentEditor是一種編輯器應用程序編輯器區域打開。

回答

9

根據JavaDoc爲ISelectionService.addSelectionListener(String partId, ISelectionListener listener)(重點是礦):

添加該被通知的特定部分選擇偵聽器時與該指定ID的部件選擇的變化。這與部分激活無關 - 該部分不需要被激活以發送通知。

創建零件時,偵聽器將傳遞零件的初始選擇。處理零件時,偵聽器將傳遞null選擇,但僅當偵聽器實現INullSelectionListener時纔會傳遞該偵聽器。

注意:由於每個編輯器沒有唯一的partId,因此無法正確跟蹤編輯器部件。

所以,當你想跟蹤編輯器選擇時,不要使用這種方法。而是使用ISelectionService.addSelectionListener(ISelectionListener listener)和使用instanceof檢查ISelectionListener.selectionChanged(IWorkbenchPart part, ISelection selection)給定的部分...

小記代碼:存在於每個窗口的基礎上選擇的服務,所以如果你有多個工作臺窗口,他們每個人都有自己的服務實例。

出於這個原因,我通常在我的視圖和編輯器使用下面的代碼:

ISelectionService ss = getSite().getWorkbenchWindow().getSelectionService(); 
ss.addPostSelectionListener(listener); 

通過這種方式,使用監聽器將來自於正確的窗口。

+0

非常感謝,這正是我一直在尋找的。 – Kris

+0

對不起,爲什麼你在最後一個例子中使用* post * SelectionListener,而其餘的答案是關於正常的選擇監聽器?它是出於某種原因還是打字錯誤? – Alex

+0

'ss.addPostSelectionListener(listener)'和'ss.addSelectionListener(listener)'是相等的,除非選擇將來自「可滾動」小部件,如表格。這裏'ss.addSelectionListener(listener)'會通知每個選擇改變的監聽器,而'ss.addPostSelectionListener(監聽器)'只會在最後一次改變後400ms通知監聽器。我總是使用後期版本。 –

相關問題