问候 Stackoverflow 的同胞们,
我正在开发 Eclipse RCP 应用程序,并且必须添加SelectionListener
to the Project Explorer view
创建后的那一刻。
我意识到我无法在我的贡献插件的激活器中执行此操作,而为了获得SelectionService
via PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService()
我必须有一个活动的工作台窗口(即null
当。。。的时候Activator start()
叫做)
所以我的问题是:
我什么时候可以拿到SelectionService
所以这样Project Explorer view
已创建且可见,但用户尚未能够“按任何按钮”?
任何意见和建议都表示赞赏!
当您确实想从启动时跟踪用户选择而没有可以注册的 UI(如视图)时ISelectionListener
创建时,您可以使用启动挂钩。
Eclipse提供了扩展点org.eclipse.ui.startup
。它接受一个实现接口的类org.eclipse.ui.IStartup
。它将在 UI 创建后被调用,因此ISelectionService
那么已经可用:
public class StartupHook implements IStartup, ISelectionListener {
@Override
public void earlyStartup() {
final IWorkbench workbench = PlatformUI.getWorkbench();
workbench.addWindowListener(new IWindowListener() {
@Override
public void windowOpened(IWorkbenchWindow window) {
addSelectionListener(window);
}
@Override
public void windowClosed(IWorkbenchWindow window) {
removeSelectionListener(window);
}
/* ... */
});
workbench.getDisplay().asyncExec(new Runnable() {
public void run() {
for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) {
addSelectionListener(window);
}
}
});
}
private void addSelectionListener(IWorkbenchWindow window) {
if (window != null) {
window.getSelectionService().addSelectionListener("org.eclipse.ui.navigator.ProjectExplorer", this);
}
}
private void removeSelectionListener(IWorkbenchWindow window) {
if (window != null) {
window.getSelectionService().removeSelectionListener("org.eclipse.ui.navigator.ProjectExplorer", this);
}
}
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
// TODO handle selection changes
System.out.println("selection changed");
}
}
注意不鼓励使用此 UI 启动挂钩 http://eclipse-tips.com/tips/3-top-10-mistakes-in-eclipse-plug-in-development因为它会强制 OSGi 尽早激活您的捆绑包(因此所有依赖的捆绑包也是如此!)并减慢系统启动速度。因此,请确保您的包裹整齐、纤薄。将捆绑包依赖性降至最低。有时需要将启动挂钩代码移至单独的包中才能实现此目的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)