![](/img/trans.png)
[英]“No application id has been found” after running eclipse RCP application
[英]Eclipse RCP - add a Listener right after a View has been created
问候Stackoverflowians,
我正在开发Eclipse RCP应用程序,并且必须在创建后立即将SelectionListener
添加到Project Explorer view
。
我已经意识到我不能在我的贡献插件的Activator中执行此操作,而为了通过PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService()
获取SelectionService
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService()
我必须有一个活动的工作台窗口(这是调用Activator start()
时返回null
所以我的问题是:我什么时候可以获得SelectionService
以便创建Project Explorer view
并且可见,但是用户还没有能够“按任何按钮”?
任何意见和建议表示赞赏!
如果您真的想要从启动时跟踪用户选择而没有可以在创建时注册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很早就激活您的捆绑包(所以所有依赖捆绑包也是如此!)并减慢系统启动速度。 所以请确保你的包很整齐。 将捆绑依赖性降至最低。 有时需要将启动钩子代码移动到一个单独的包中以实现这一点。
您可以在ApplicationWorkbenchWindowAdvisor.postWindowOpen()
方法中添加您的选择侦听器(此时您可以确定已创建工作台)。 如果要添加它,当“Project explorer view”可见时,则可以执行以下操作:
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().addPartListener(new PartAdapter() {
@Override
public void partVisible(IWorkbenchPartReference partRef) {
if ("org.eclipse.ui.navigator.ProjectExplorer".equals(partRef.getId())) {
// add selection listener
}
}
});
UPD:好的,如果您无法访问AppliationWorkbenchWindowAdvisor(这很奇怪,如果您正在开发Eclipse RCP产品),那么ASAIK,没有干净的解决方案可以获得有关UI可用性的通知。 因此,其中一个解决方案可能是添加一个等待UI初始化的作业。 在你的插件Activator.start()
方法中考虑添加以下作业(确保你可以将它提取到单独的类并在许多方面进行改进,但一开始就应该足够了):
Job j = new Job("") {
@Override
protected IStatus run(IProgressMonitor monitor) {
final boolean[] workbenchAvailable = new boolean[] { false };
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
if (PlatformUI.isWorkbenchRunning() && PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) {
workbenchAvailable[0] = true;
}
}
});
if (workbenchAvailable[0]) {
System.out.println("Workbench is available");
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
ISelectionService selectionService =
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService();
System.out.println(selectionService);
}
});
} else {
System.out.println("Waiting for the Workbench ...");
schedule(1000);
}
return Status.OK_STATUS;
}
};
j.schedule();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.