如果您真的想在启动时跟踪用户选择,而没有可以注册ISelectionListener
创建时的 UI(如视图),您可以使用启动挂钩。
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 启动挂钩,因为它会强制 OSGi 非常早地激活您的包(以及所有相关的包!)并减慢系统启动速度。因此,请确保您的包裹整洁且纤薄。将捆绑包依赖性降至最低。有时有必要将启动钩子代码移动到一个单独的包中来实现这一点。