如何在启动后立即使Eclipse RCP应用程序的键盘快捷键(加速器)正常工作?

时间:2011-05-04 20:26:44

标签: eclipse-rcp

我们的Eclipse RCP应用程序最初是在3.1 / 3.2时代构建的,并且在3.2上运行,直到我们最近切换到3.6。其IApplication通过PlatformUI.createAndRunWorkbench(...)运行。我们传递给该函数的WorkbenchAdvisor会覆盖createWorkbenchWindowAdvisor(...)以返回WorkbenchWindowAdvisorcreateActionBarAdvisor(...)会返回ActionBarAdvisor

这个ActionBarAdvisor的{​​{1}}创建了makeActions(...)register() s,其中许多org.eclipse.jface.action.Action在其构造函数中执行setAccelerator(SWT.CTRL | 'O');Action随后安装在ActionBarAdvisor的{​​{1}}和fillMenuBar(...)方法中。

我们遇到的问题(现在我们在Eclipse RCP 3.6上)是这些加速器在显示菜单之前似乎没有活动(即使再次关闭菜单之外不采取任何操作)。

我们看到a relevant bug,但在了解如何将其补救措施应用于我们的情况方面遇到了一些困难。我们认识到,我们“应该”使用命令,处理程序和键绑定而不是fillCoolBar(...)。但我们希望我们不必走那条路。

如果应用程序启动,我们怎样才能让我们的加速器“活动”?

3 个答案:

答案 0 :(得分:2)

如果您不选择使用o.e.ui.bindings扩展点,则没有更好的方法。您应该像在答案中一样强制更新menuManager。

答案 1 :(得分:1)

正如@Prakash所提到的,如果你想在你的RCP应用程序中保持这条路径,你必须渲染所有主菜单才能看到你的加速器。

有一个部分升级路径可以让您在正确的轨道上执行命令,而无需立即强制完成切换。对于菜单中的每个操作,定义一个带有id的命令,并在plugin.xml中定义与所需快捷方式的绑定。然后,当您在ActionBarAdvisor中创建操作时,请不要设置加速器。将IAction.setActionDefinitionId(*)设置为命令id,可以调用register(action);

然后您不再需要使用menuManager.updateAll(true)来急切渲染所有主菜单。

答案 2 :(得分:0)

在四处寻找并试图尝试应用the bug的建议后,我们将以下内容添加到我们的WorkbenchWindowAdvisor,这似乎已经成功了:

@Override
public void postWindowCreate() {
    getWindowConfigurer().getActionBarConfigurer().getMenuManager().updateAll(true);
}

我们不知道这与Workbench的设计期望有多好;可能有更好的方法。