在RCP开发中,创建菜单、工具栏非常的方便,实际上,RCP UI界面大部分都可以不需要写任何代码就可以轻松地创建。今天主要介绍的是菜单和工具栏的创建。
创建菜单栏、工具栏主要有两种方式:一种是通过纯代码的方式;另一种是通过在plugin.xml中通过配置文件的方式实现。实际上大部分引用程序开发过程混合了两种方式,效果更加明显。
下面将分别介绍这两种方式。
1. 在plugin.xml中通过配置文件的方式实现
以具体实例说明,创建一RCP项目,设置项目名称为org.test.menu_toolbar,并且选择Hello RCP模板(参考 创建RCP项目)。创建好的项目如下图所示;
然后双击打开plugin.xml, 找到扩展页,如下图
里面默认已经创建了两个扩展,我们点“添加”按钮,新建一个org.eclipse.ui.actionSets扩展,如下图所示
里面已经默认添加了一个actionSet,若没有则右键选择该扩展点,新建一个actionSet,id保持默认,注意设置visible为true。选择该actionSet,然后右键新增一个,id保持默认,修改label为测试菜单一。(注意,标有*号的表示必须填写)结果如下图
选择创建的menu,右键创建一个separator,设置name为separator1,如下图
选择创建的actionSet,右键创建两个action,设置如下表
id | label | menuPath | class |
org.test.menu_toolbar.actions.testAction1 | Action1 | org.test.menu_toolbar.menu1/separator1 | org.test.menu_toolbar.actions.TestAction1 |
org.test.menu_toolbar.actions.testAction2 | Action2 | org.test.menu_toolbar.menu1/separator1 | org.test.menu_toolbar.actions.TestAction2 |
menuPath表示该action出现在菜单上的位置,org.test.menu_toolbar.menu1即刚才创建的menu,separator即该菜单下创建的一个分隔条,两者之间用“/”隔开,表示该action将插入到该分隔条之后。完成后如下图所示
为两个action添加相应事件,选择action1,点击class超链接,如下图
该链接将打开一个创建action响应事件的对话框,默认实现IWorkbenchWindowActionDelegate接口,点确定,创建类org.test.menu_toolbar.actions.TestAction1,代码如下:
package org.test.menu_toolbar.actions;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
public class TestAction1 implements IWorkbenchWindowActionDelegate {
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public void init(IWorkbenchWindow window) {
// TODO Auto-generated method stub
}
@Override
public void run(IAction action) {
// TODO Auto-generated method stub
}
@Override
public void selectionChanged(IAction action, ISelection selection) {
// TODO Auto-generated method stub
}
}
其中run方法将实现具体操作,我们修改其代码,单击该action,将会弹出一信息对话框,
@Override
public void run(IAction action) {
MessageDialog.openInformation(null, "测试 ", "Hello,测试菜单项1");
}
类似地,给action2也进行相似的操作,添加代码为
@Override
public void run(IAction action) {
MessageDialog.openInformation(null, "测试 ", "Hello,测试菜单项2");
}
执行应用程序,结果如下图
单击Action1,出现
不知道大家注意到没有,Action1、Action2出现的顺序与我们定义的顺序正好相反,
实际上菜单在定义时应该将其设置为与出现的顺序相反。
通过以上介绍,我们发现,在RCP应用程序中创建Menu非常简单。创建toolbar也是如此,实际上,
只要对上述设置及代码稍作修改,我们定义的两个Action就可以出现在工具栏上。
在plugin.xml中,选择刚才创建的action1,设置其toolbarPath为additions(这是Eclipse内置的标准工具栏插入点)
,icon为icons/alt_window_16.gif。为action2做同样的设置。是不是这样就可以了呢,实际上还要对代码稍作修改,才能显
示工具栏。打开ApplicationWorkbenchWindowAdvisor.java类,修改其preWindowOpen方法,如下
public void preWindowOpen() {
IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
configurer.setInitialSize(new Point(400, 300));
configurer.setShowCoolBar(true);//原来为false,修改为true,即可显示工具栏
configurer.setShowStatusLine(false);
configurer.setTitle("Hello RCP");
}
现在执行一下,就可以看见在应用程序中出现了工具栏,刚才创建的两个action也出现在其中了,点击发现它们和刚才在菜单
上一样,顺序和执行的操作时相同的。如下图所示
2. 通过纯代码的方式实现
除了上述用配置文件设置外,还可以通过纯编码实现。
打开ApplicationActionBarAdvisor.java类,其代码如下
package org.test.menu_toolbar;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
super(configurer);
}
protected void makeActions(IWorkbenchWindow window) {
}
protected void fillMenuBar(IMenuManager menuBar) {
}
}
在这里面,我们也可以创建菜单和工具条,首先我们在org.test.menu_toolbar.actions包下创建一个类TestAction3,它继承Action类,具体代码如下
package org.test.menu_toolbar.actions;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.test.menu_toolbar.Activator;
public class TestAction3 extends Action {
@Override
public void run() {
MessageDialog.openInformation(null, "测试", "Hello,测试Action3");
super.run();
}
@Override
public ImageDescriptor getImageDescriptor() {
// TODO Auto-generated method stub
return Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/alt_window_16.gif"); //设置action图标
}
@Override
public String getText() {
// TODO Auto-generated method stub
return "Action3"; //设置action标题
}
}
修改ApplicationActionBarAdvisor.java类,
package org.test.menu_toolbar;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
import org.test.menu_toolbar.actions.TestAction3;
public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
private Action testAction3;
public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
super(configurer);
}
protected void makeActions(IWorkbenchWindow window) {
testAction3=new TestAction3();
//register(testAction3);
}
protected void fillMenuBar(IMenuManager menuBar) {
MenuManager testMenu=new MenuManager("测试菜单","org.test.menu_toolbar.menu1");
testMenu.add(testAction3);
menuBar.add(testMenu);
}
}
MenuManager testMenu=new MenuManager("测试菜单","org.test.menu_toolbar.menu1"); 中org.test.menu_toolbar.menu1即前面在配置文件中创建的菜单。
添加工具栏,将action3添加到工具栏上,修改ApplicationActionBarAdvisor类,覆写fillCoolBar()方法,代码如下,
@Override
protected void fillCoolBar(ICoolBarManager coolBar) {
ToolBarManager testBar=new ToolBarManager(SWT.FLAT | SWT.SHADOW_OUT);
testBar.add(testAction3);
coolBar.add(testBar);
super.fillCoolBar(coolBar);
}
执行,结果如图所示
实际上菜单栏和工具栏还可以通过扩展org.eclipse.ui.commands、org.eclipse.ui.menus、org.eclipse.ui.handlers等实现。
打开plugin.xml,新建org.eclipse.ui.commands扩展,如下图
新建一个command,id为org.test.menu_toolbar.commands.testCmd,name为“测试”,其他默认,如下图
添加扩展org.eclipse.ui.handlers,如下图
新建一个handler,设置commandId为 org.test.menu_toolbar.commands.testCmd(即刚添加的command),设置class为org.test.menu_toolbar.commands.TestCmd(即command操作的实现类),如下图
点击class超链接,弹出对话框,添加TestCmd类,并且继承AbstractHandler,添加后代码为
package org.test.menu_toolbar.commands;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
public class TestCmd extends AbstractHandler implements IHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
// TODO Auto-generated method stub
return null;
}
}
修改代码为
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
MessageDialog.openInformation(HandlerUtil.getActiveShell(event), "测试", "测试command");
return null;
}
在plugin.xml中添加扩展org.eclipse.ui.menus,如下图
添加一个menuContribution,设置locationURL为menu:org.eclipse.ui.main.menu (注意,menu:org.eclipse.ui.main.menu为Eclipse标准菜单扩展位置),如下图
在menuContribution添加一个menu,设置label为“测试菜单二”,id为“testMenu2”,再在它下面添加一个command,设置commandId为org.test.menu_toolbar.commands.testCmd(即刚才添加的command),如下图 运行,如下图
将这个command添加到工具栏上,再添加一个menuContribution,设置locationURL为toolbar:org.eclipse.ui.main.toolbar(注意,toolbar:org.eclipse.ui.main.toolbar为Eclipse标准工具栏扩展位置),在其下面添加一个toolbar,id保持不变,在这个toolbar下面添加一个command,commandId设置为org.test.menu_toolbar.commands.testCmd(即刚才添加的command),如下图
执行,结果如下图
在工具栏上出现了我们所添加的command。
我们可以看到用actionSets和commands都可以添加菜单和工具栏,但是后者比前者更加优美(见 前一篇)。所以我推荐使用后者。
另外,使用配置和代码混合编写可能有时候会更加方便。Eclipse中许多Action都可以被重用,如退出程序、显示透视图对话框等,我们可以灵活应用。