Eclipse RCP修改Ctrl+Shift+R绑定出现Handler冲突异常如何解决?
解决方案
方案1:使用org.eclipse.ui.handlers扩展点重写默认命令Handler
原生org.eclipse.ui.navigate.openResource命令已经绑定了IDE自带的Handler,你之前用actionSet注册的Handler和原生优先级一致所以触发冲突,直接通过Handler扩展点指定更高优先级即可覆盖默认实现:
<!-- 先移除原actionSet配置里的definitionId属性,避免重复注册 --> <extension point="org.eclipse.ui.handlers"> <handler class="com.project.handler.ResourceHandler" commandId="org.eclipse.ui.navigate.openResource"> <!-- 全局激活,优先级高于原生Handler --> <activeWhen> <with variable="activeWorkbenchWindow"> <instanceof value="org.eclipse.ui.IWorkbenchWindow"/> </with> </activeWhen> </handler> </extension>
该方案不需要修改快捷键绑定,原有Ctrl+Shift+R会直接触发你的自定义逻辑,不会出现冲突异常。
方案2:解绑原生快捷键,绑定到自定义命令
如果不想修改原有命令的默认实现,可以自定义新的命令ID,再把Ctrl+Shift+R绑定到你的新命令上:
- 定义自定义命令
<extension point="org.eclipse.ui.commands"> <command defaultHandler="com.project.handler.ResourceHandler" id="com.project.command.openCustomResource" name="Open Custom Resource"> </command> </extension>
- 覆盖原有快捷键绑定
<extension point="org.eclipse.ui.bindings"> <!-- 把Ctrl+Shift+R绑定到自定义命令 --> <key commandId="com.project.command.openCustomResource" contextId="org.eclipse.ui.contexts.window" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="M1+M2+R"/> <!-- 禁用原生快捷键绑定 --> <key commandId="org.eclipse.ui.navigate.openResource" contextId="org.eclipse.ui.contexts.window" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="M1+M2+R" deleted="true"/> </extension>
该方案完全不会和原生Handler产生冲突,菜单触发和快捷键触发都可以走你的自定义逻辑。
方案3:禁用原生Handler扩展
通过Eclipse activities机制禁用原生的OpenResourceHandler注册项,从根源消除冲突:
<extension point="org.eclipse.ui.activities"> <activity id="com.project.disableNativeOpenResource" name="Disable Native Open Resource Handler"> </activity> <activityPatternBinding activityId="com.project.disableNativeOpenResource" pattern="org.eclipse.ui.ide/org.eclipse.ui.internal.ide.handlers.OpenResourceHandler"> </activityPatternBinding> </extension>
禁用原生Handler后,你原来的actionSet配置就可以正常绑定org.eclipse.ui.navigate.openResource命令,不会再抛出冲突异常。
内容的提问来源于stack exchange,提问作者A.Goel
相关产品推荐
相关产品推荐

