Eclipse 插件开发 3 菜单栏
- 1 增加菜单
- 2 指定位置
- 3 点击事件
- 4 二级菜单 (静态)
- 5 二级菜单 (动态)
位置 | 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 {@Overridepublic 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"><command commandId="com.xu.test.commands.submenu1Command" icon="icons/sample.png" id="com.xu.test.menus.submenu1" label="二级菜单1"></command><command commandId="com.xu.test.commands.submenu2Command" icon="icons/sample.png" id="com.xu.test.menus.submenu2" label="二级菜单2"></command><command commandId="com.xu.test.commands.submenu3Command" icon="icons/sample.png" id="com.xu.test.menus.submenu3" label="二级菜单3"></command><menu id="com.xu.test.menus.submenu4" label="二级菜单4"><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"><command defaultHandler="com.xu.handlers.HelloHandler" id="com.xu.test.commands.submenu1Command" name="二级菜单1命令"></command><command defaultHandler="com.xu.handlers.SampleHandler" id="com.xu.test.commands.submenu2Command" name="二级菜单2命令"></command><command defaultHandler="com.xu.handlers.HelloHandler" id="com.xu.test.commands.submen3Command" name="二级菜单3命令"></command><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 {@Overrideprotected IContributionItem[] getContributionItems() {List<IContributionItem> items = new ArrayList<>();for (int i = 1; i <= 7; i++) {final int index = i;items.add(new ContributionItem() {@Overridepublic 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"><command commandId="com.xu.test.commands.submenu1Command" icon="icons/sample.png" id="com.xu.test.menus.submenu1" label="二级菜单1"></command><command commandId="com.xu.test.commands.submenu2Command" icon="icons/sample.png" id="com.xu.test.menus.submenu2" label="二级菜单2"></command><command commandId="com.xu.test.commands.submenu3Command" icon="icons/sample.png" id="com.xu.test.menus.submenu3" label="二级菜单3"></command><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"><command defaultHandler="com.xu.view.handlers.HelloHandler" id="com.xu.test.commands.submenu1Command" name="二级菜单1命令"></command><command defaultHandler="com.xu.view.handlers.SampleHandler" id="com.xu.test.commands.submenu2Command" name="二级菜单2命令"></command><command defaultHandler="com.xu.view.handlers.HelloHandler" id="com.xu.test.commands.submen3Command" name="二级菜单3命令"></command><command defaultHandler="com.xu.view.handlers.HelloHandler" id="com.xu.test.commands.submenu4_1Command" name="三级菜单1命令"></command></extension></plugin>
