Eclipse 插件开发 3 菜单栏

发布于:2025-05-01 ⋅ 阅读:(63) ⋅ 点赞:(0)

位置 locationURI 备注
菜单栏 menu:org.eclipse.ui.main.menu 添加到传统菜单
工具栏 toolbar:org.eclipse.ui.main.toolbar 添加到工具栏

1 增加菜单

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>

      <extension point="org.eclipse.ui.menus">
            <menuContribution locationURI="menu:org.eclipse.ui.main.menu?after=additions">
                  <menu id="com.xu.learn.menus.sampleMenu" label="一级菜单">
                        <command commandId="com.xu.learn.commands.sampleCommand" id="com.xu.learn.menus.sampleCommand">
                        </command>
                  </menu>
            </menuContribution>
      </extension>

</plugin>

在这里插入图片描述

2 指定位置

XML 字段 含义
extension.menuContribution locationURI 菜单栏位置 menu:org.eclipse.ui.main.menu?after=additions,如Window就是window
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>

      <extension point="org.eclipse.ui.menus">
            <menuContribution locationURI="menu:org.eclipse.ui.main.menu?after=window">
                  <menu id="com.xu.learn.menus.sampleMenu" label="一级菜单">
                        <command commandId="com.xu.learn.commands.sampleCommand" id="com.xu.learn.menus.sampleCommand">
                        </command>
                  </menu>
            </menuContribution>
      </extension>

</plugin>

在这里插入图片描述

3 点击事件

XML 字段 含义
extension.handler commandId 处理id
menu.command commandId 处理id
menu.command class 为处理类的路径
package com.xu.learn.handlers;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.jface.dialogs.MessageDialog;

public class SampleHandler extends AbstractHandler {

	@Override
	public Object execute(ExecutionEvent event) throws ExecutionException {
		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
		MessageDialog.openInformation(
				window.getShell(),
				"Learn",
				"点击菜单弹框");
		return null;
	}
}
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>

      <extension point="org.eclipse.ui.menus">
            <menuContribution locationURI="menu:org.eclipse.ui.main.menu?after=additions">
                  <menu id="com.xu.learn.menus.sampleMenu" label="一级菜单">
                        <command commandId="com.xu.learn.commands.sampleCommand" id="com.xu.learn.menus.sampleCommand">
                        </command>
                  </menu>
            </menuContribution>
      </extension>

      <extension point="org.eclipse.ui.handlers">
            <handler class="com.xu.learn.handlers.SampleHandler" commandId="com.xu.learn.commands.sampleCommand">
            </handler>
      </extension>

</plugin>

在这里插入图片描述

4 二级菜单 (静态)

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>

      <!-- 添加顶部菜单 -->
      <extension point="org.eclipse.ui.menus">
            <menuContribution locationURI="menu:org.eclipse.ui.main.menu">
                  <!-- 添加顶部 一级菜单 -->
                  <menu id="com.xu.test.menus.menu1" label="菜单1">
                        <!-- 一级菜单 下增加 二级菜单1 -->
                        <command commandId="com.xu.test.commands.submenu1Command" icon="icons/sample.png" id="com.xu.test.menus.submenu1" label="二级菜单1">
                        </command>
                        <!-- 一级菜单 下增加 二级菜单2 -->
                        <command commandId="com.xu.test.commands.submenu2Command" icon="icons/sample.png" id="com.xu.test.menus.submenu2" label="二级菜单2">
                        </command>
                        <!-- 一级菜单 下增加 二级菜单3 -->
                        <command commandId="com.xu.test.commands.submenu3Command" icon="icons/sample.png" id="com.xu.test.menus.submenu3" label="二级菜单3">
                        </command>
                        <!-- 一级菜单 下增加 二级菜单3 -->
                        <menu id="com.xu.test.menus.submenu4" label="二级菜单4">
                              <!-- 二级级菜单 下增加 三级菜单1 -->
                              <command commandId="com.xu.test.commands.submenu4_1Command" id="com.xu.test.menus.submenu4_1" label="三级菜单1">
                              </command>
                        </menu>
                  </menu>
            </menuContribution>
      </extension>

      <!-- 菜单点击命令 -->
      <extension point="org.eclipse.ui.commands">
            <!-- 二级菜单1 命令 -->
            <command defaultHandler="com.xu.handlers.HelloHandler" id="com.xu.test.commands.submenu1Command" name="二级菜单1命令">
            </command>
            <!-- 二级菜单2 命令 -->
            <command defaultHandler="com.xu.handlers.SampleHandler" id="com.xu.test.commands.submenu2Command" name="二级菜单2命令">
            </command>
            <!-- 二级菜单3 命令 -->
            <command defaultHandler="com.xu.handlers.HelloHandler" id="com.xu.test.commands.submen3Command" name="二级菜单3命令">
            </command>
            <!-- 三级菜单1 命令 -->
            <command defaultHandler="com.xu.handlers.HelloHandler" id="com.xu.test.commands.submenu4_1Command" name="三级菜单1命令">
            </command>
      </extension>
      
</plugin>

在这里插入图片描述

5 二级菜单 (动态)

方式 场景 实现
继承 CompoundContributionItem + dynamic 动态生成菜单项 推荐
反复修改 plugin.xml 麻烦、不灵活 plugin.xml 是静态配置
package com.xu.dynamic;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.actions.CompoundContributionItem;

public class DynamicSubMenu extends CompoundContributionItem {

    @Override
    protected IContributionItem[] getContributionItems() {
        List<IContributionItem> items = new ArrayList<>();
        // 示例:根据某些条件动态生成7个子项
        for (int i = 1; i <= 7; i++) {
            final int index = i;
            items.add(new ContributionItem() {
                @Override
                public void fill(Menu menu, int indexInMenu) {
                    MenuItem menuItem = new MenuItem(menu, org.eclipse.swt.SWT.PUSH, indexInMenu);
                    menuItem.setText("动态菜单项 " + index);
                    menuItem.addListener(org.eclipse.swt.SWT.Selection, e -> {
                        System.out.println("你点击了:动态菜单项 " + index);
                        // 你可以在这里调用命令或其他逻辑
                    });
                }
            });
        }

        return items.toArray(new IContributionItem[0]);
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>

      <!-- 添加顶部菜单 -->
      <extension point="org.eclipse.ui.menus">
            <menuContribution locationURI="menu:org.eclipse.ui.main.menu">
                  <!-- 添加顶部 一级菜单 -->
                  <menu id="com.xu.test.menus.menu1" label="菜单1">
                        <!-- 一级菜单 下增加 二级菜单1 -->
                        <command commandId="com.xu.test.commands.submenu1Command" icon="icons/sample.png" id="com.xu.test.menus.submenu1" label="二级菜单1">
                        </command>
                        <!-- 一级菜单 下增加 二级菜单2 -->
                        <command commandId="com.xu.test.commands.submenu2Command" icon="icons/sample.png" id="com.xu.test.menus.submenu2" label="二级菜单2">
                        </command>
                        <!-- 一级菜单 下增加 二级菜单3 -->
                        <command commandId="com.xu.test.commands.submenu3Command" icon="icons/sample.png" id="com.xu.test.menus.submenu3" label="二级菜单3">
                        </command>
                        <!-- 一级菜单 下增加 二级菜单3 -->
                        <menu id="com.xu.test.menus.submenu4" label="二级菜单4">
                              <!-- 动态生成三级菜单 -->
                              <dynamic class="com.xu.dynamic.DynamicSubMenu" id="com.xu.test.menus.dynamicSubmenu"/>
                        </menu>
                  </menu>
            </menuContribution>
      </extension>

      <!-- 菜单点击命令 -->
      <extension point="org.eclipse.ui.commands">
            <!-- 二级菜单1 命令 -->
            <command defaultHandler="com.xu.view.handlers.HelloHandler" id="com.xu.test.commands.submenu1Command" name="二级菜单1命令">
            </command>
            <!-- 二级菜单2 命令 -->
            <command defaultHandler="com.xu.view.handlers.SampleHandler" id="com.xu.test.commands.submenu2Command" name="二级菜单2命令">
            </command>
            <!-- 二级菜单3 命令 -->
            <command defaultHandler="com.xu.view.handlers.HelloHandler" id="com.xu.test.commands.submen3Command" name="二级菜单3命令">
            </command>
            <!-- 三级菜单1 命令 -->
            <command defaultHandler="com.xu.view.handlers.HelloHandler" id="com.xu.test.commands.submenu4_1Command" name="三级菜单1命令">
            </command>
      </extension>
      
</plugin>

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到