You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Eclipse RCP中调整文件→新建子菜单菜单项顺序的方案

解决方案:精准插入自定义菜单项到File→New指定位置

我来帮你搞定这个RCP菜单定位的难题!你提到的问题核心在于:默认的File→New菜单里,项目、包这类标准菜单项并没有直接暴露易获取的定位ID,导致你没法直接用after=xxx精准插入。下面给你两种实打实的解决方案,分别对应XML配置和Java代码实现,完全不需要应用顾问:


XML配置方案

要在XML里精准插入,关键是找到目标标准菜单项的实际ID,然后在menuContributionlocationURI里指定after=目标ID

步骤1:获取标准菜单项的ID

你可以通过两种方式拿到ID:

  • 菜单Spy进阶用法:打开菜单Spy(按Alt+Shift+F1点击目标菜单项),在弹出的详情面板里,找到Contribution Item ID字段,这就是你需要的定位ID。比如"Project..."项的ID通常是org.eclipse.ui.wizards.new.project,Java包项的ID是org.eclipse.jdt.ui.wizards.new.java.package
  • 插件注册表查询:打开Eclipse的Plug-in Registry视图(Window→Show View→Other→Plug-in Development→Plug-in Registry),找到对应插件(比如org.eclipse.ui对应通用项目,org.eclipse.jdt.ui对应Java相关项),查看其org.eclipse.ui.menus扩展,找到目标菜单项的ID。

步骤2:编写XML配置

拿到ID后,直接在plugin.xml里配置:

<extension point="org.eclipse.ui.menus">
   <menuContribution locationURI="menu:new?after=org.eclipse.ui.wizards.new.project">
      <command
            commandId="com.your.plugin.customCommand"
            label="我的自定义项"
            style="push">
      </command>
   </menuContribution>
</extension>

after=后面的ID换成你要插入位置的目标菜单项ID即可。


Java代码实现方案

如果XML配置满足不了需求,用Java代码可以更灵活地定位和插入,避开IContributionRoot的限制:

核心思路

通过IMenuManager层级遍历找到File→New菜单,再定位到目标菜单项,最后用insertAfter方法插入自定义项。

示例代码

public class CustomNewMenuContribution extends ContributionFactory {
    @Override
    public void createContributionItems(IServiceLocator serviceLocator, IContributionRoot additions) {
        // 获取当前工作台窗口
        IWorkbenchWindow window = serviceLocator.getService(IWorkbenchWindow.class);
        if (window == null) return;

        // 逐层获取菜单管理器:窗口菜单 → File菜单 → New子菜单
        IMenuManager rootMenu = window.getMenuManager();
        IMenuManager fileMenu = (IMenuManager) rootMenu.findMenuUsingPath("file");
        if (fileMenu == null) return;

        IMenuManager newMenu = (IMenuManager) fileMenu.findMenuUsingPath("new");
        if (newMenu == null) return;

        // 方式1:通过ID定位目标菜单项
        IContributionItem targetItem = newMenu.find("org.eclipse.ui.wizards.new.project");
        
        // 方式2:如果ID不确定,通过标签文本定位(注意本地化问题,优先用ID)
        // for (IContributionItem item : newMenu.getItems()) {
        //     if ("Project...".equals(item.getText())) {
        //         targetItem = item;
        //         break;
        //     }
        // }

        if (targetItem != null) {
            // 创建自定义命令菜单项
            CommandContributionItem customItem = new CommandContributionItemBuilder(
                    "customItemId",
                    "com.your.plugin.customCommand")
                    .setLabel("我的自定义项")
                    .setStyle(CommandContributionItem.STYLE_PUSH)
                    .build();
            
            // 插入到目标项之后
            newMenu.insertAfter(targetItem.getId(), customItem);
        }
    }
}

注意事项

  • 确保你的插件在plugin.xml里依赖了org.eclipse.ui(如果涉及Java项还要依赖org.eclipse.jdt.ui)。
  • 若使用标签文本定位,注意多语言环境下的翻译问题,优先使用ID定位更稳妥。

内容的提问来源于stack exchange,提问作者Doctor Doom

火山引擎 最新活动