如何在RCP的Class1中判断触发的是menuItem1还是menuItem2?
解决方案:区分触发的右键菜单项
可以实现,但Eclipse RCP中没有直接的get_MenuItem_Selected()方法,需要通过传递参数的方式来区分不同菜单项,具体实现步骤如下:
1. 在右键菜单扩展中添加标识参数
在plugin.xml的菜单定义里,给两个菜单项分别配置唯一标识参数:
- 若使用
popupMenus扩展点:
<extension point="org.eclipse.ui.popupMenus"> <objectContribution id="your.plugin.id.menu1" objectClass="你的目标对象类"> <action class="org.eclipse.ui.actions.RetargetAction" id="your.plugin.id.action1" label="menuItem1" menubarPath="additions"> <parameter name="triggerMenuId" value="menuItem1"/> </action> </objectContribution> <objectContribution id="your.plugin.id.menu2" objectClass="你的目标对象类"> <action class="org.eclipse.ui.actions.RetargetAction" id="your.plugin.id.action2" label="menuItem2" menubarPath="additions"> <parameter name="triggerMenuId" value="menuItem2"/> </parameter> </objectContribution> </extension>
- 若使用
commands+handlers标准扩展方式(更推荐):
<extension point="org.eclipse.ui.commands"> <command id="your.plugin.id.openClass1" name="打开Class1"> <commandParameter id="triggerMenuId" name="菜单标识" optional="false"/> </command> </extension> <extension point="org.eclipse.ui.handlers"> <handler commandId="your.plugin.id.openClass1" class="你的Handler类路径"> <parameter name="triggerMenuId" value="menuItem1"/> </handler> <handler commandId="your.plugin.id.openClass1" class="你的Handler类路径"> <parameter name="triggerMenuId" value="menuItem2"/> </handler> </extension>
2. 在启动Class1时传递参数
通过Handler启动Class1时,在execute方法中提取参数并传递:
public Object execute(ExecutionEvent event) throws ExecutionException { String menuId = event.getParameter("triggerMenuId"); // 实例化Class1并传递标识 Class1 formPage = new Class1(editor, "pageId", "页面标题"); formPage.setTriggerMenuId(menuId); // 加入编辑器并激活 editor.addPage(formPage); editor.setActivePage(formPage); return null; }
3. 在Class1中判断触发源
在Class1中添加成员变量保存标识,即可在任意逻辑中判断:
public class Class1 extends FormPage { private String triggerMenuId; public void setTriggerMenuId(String menuId) { this.triggerMenuId = menuId; } // 示例:根据触发菜单项执行不同逻辑 private void handleMenuTrigger() { if ("menuItem1".equals(triggerMenuId)) { // 处理menuItem1触发的业务逻辑 } else if ("menuItem2".equals(triggerMenuId)) { // 处理menuItem2触发的业务逻辑 } } }
额外说明
如果是通过自定义MenuManager创建右键菜单,可直接给菜单项对应的Action设置data属性,后续在Class1中通过getSite()获取上下文数据即可。
内容的提问来源于stack exchange,提问作者jemrug
相关产品推荐
相关产品推荐

