我已经创建了一个简单的Eclipse RCP应用程序,可以在其中根据用户操作打开多个编辑器实例。我有一个单独的视图(ViewPart),我在其中监听编辑器上的选择更改。问题是视图只被通知上一次打开的编辑器的选择,之前打开的其他编辑器不再提供事件/或者视图只侦听最后打开的编辑器,而不侦听其他任何东西。即使先前打开的编辑器获得焦点,也会发生这种情况。
换句话说,只有编辑器区域中最新的编辑器提供选择事件,我想要的是,当我单击其他编辑器的标签时,我希望看到当我单击以前打开的编辑器之一时,我的视图中的更改。
在我看来,我使用:
IWorkbench workbench = PlatformUI.getWorkbench();
workbench.getActiveWorkbenchWindow().getActivePage().addSelectionListener(DocumentsEditor.ID,(ISelectionListener)this);其中DocumentEditor是在应用程序编辑器区域中打开的编辑器之一。
发布于 2011-07-16 17:10:36
来自ISelectionService.addSelectionListener(String partId, ISelectionListener listener)的JavaDoc (重点是我的):
添加特定于零件的选择侦听器,当具有给定id的零件中的选择发生更改时,系统会通知该侦听器。这与部件激活无关-部件不需要处于活动状态即可发送通知。
创建部件时,将向侦听器传递部件的初始选择。当部件被释放时,将向侦听器传递一个空选择,但前提是侦听器实现了INullSelectionListener。
注意:这将无法正确跟踪编辑器部分,因为每个编辑器都没有唯一的partId。
因此,当您想要跟踪编辑器选择时,不要使用此方法。取而代之的是使用ISelectionService.addSelectionListener(ISelectionListener listener),并使用instanceof在ISelectionListener.selectionChanged(IWorkbenchPart part, ISelection selection)中检查给定的部分...
注意代码:选择服务以每个窗口为基础存在,因此如果您有多个工作台窗口,则每个窗口都有自己的服务实例。
因此,我通常在视图和编辑器中使用以下代码:
ISelectionService ss = getSite().getWorkbenchWindow().getSelectionService();
ss.addPostSelectionListener(listener);这样,使用过的监听器将来自正确的窗口。
https://stackoverflow.com/questions/6714610
复制相似问题