Eclipse RCP开发3--菜单、工具栏

时间:2023-01-20 21:49:12

     在RCP开发中,创建菜单、工具栏非常的方便,实际上,RCP UI界面大部分都可以不需要写任何代码就可以轻松地创建。今天主要介绍的是菜单和工具栏的创建。

    创建菜单栏、工具栏主要有两种方式:一种是通过纯代码的方式;另一种是通过在plugin.xml中通过配置文件的方式实现。实际上大部分引用程序开发过程混合了两种方式,效果更加明显。

    下面将分别介绍这两种方式。

1. 在plugin.xml中通过配置文件的方式实现

    以具体实例说明,创建一RCP项目,设置项目名称为org.test.menu_toolbar,并且选择Hello RCP模板(参考 创建RCP项目)。创建好的项目如下图所示;

Eclipse RCP开发3--菜单、工具栏

    然后双击打开plugin.xml, 找到扩展页,如下图

Eclipse RCP开发3--菜单、工具栏     里面默认已经创建了两个扩展,我们点“添加”按钮,新建一个org.eclipse.ui.actionSets扩展,如下图所示

Eclipse RCP开发3--菜单、工具栏

 

Eclipse RCP开发3--菜单、工具栏     里面已经默认添加了一个actionSet,若没有则右键选择该扩展点,新建一个actionSet,id保持默认,注意设置visible为true。选择该actionSet,然后右键新增一个,id保持默认,修改label为测试菜单一。(注意,标有*号的表示必须填写)结果如下图

Eclipse RCP开发3--菜单、工具栏

    选择创建的menu,右键创建一个separator,设置name为separator1,如下图

Eclipse RCP开发3--菜单、工具栏

    选择创建的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将插入到该分隔条之后。完成后如下图所示

Eclipse RCP开发3--菜单、工具栏

    为两个action添加相应事件,选择action1,点击class超链接,如下图

Eclipse RCP开发3--菜单、工具栏     该链接将打开一个创建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");

}
  执行应用程序,结果如下图
Eclipse RCP开发3--菜单、工具栏
    单击Action1,出现
Eclipse RCP开发3--菜单、工具栏 
    不知道大家注意到没有,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也出现在其中了,点击发现它们和刚才在菜单
上一样,顺序和执行的操作时相同的。如下图所示
Eclipse RCP开发3--菜单、工具栏
 

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);
}
 
执行,结果如图所示
Eclipse RCP开发3--菜单、工具栏 

 

    实际上菜单栏和工具栏还可以通过扩展org.eclipse.ui.commands、org.eclipse.ui.menus、org.eclipse.ui.handlers等实现。

    打开plugin.xml,新建org.eclipse.ui.commands扩展,如下图

Eclipse RCP开发3--菜单、工具栏     新建一个command,id为org.test.menu_toolbar.commands.testCmd,name为“测试”,其他默认,如下图

Eclipse RCP开发3--菜单、工具栏

    添加扩展org.eclipse.ui.handlers,如下图

Eclipse RCP开发3--菜单、工具栏

    新建一个handler,设置commandId为 org.test.menu_toolbar.commands.testCmd(即刚添加的command),设置class为org.test.menu_toolbar.commands.TestCmd(即command操作的实现类),如下图

Eclipse RCP开发3--菜单、工具栏

    点击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,如下图

Eclipse RCP开发3--菜单、工具栏

 

    添加一个menuContribution,设置locationURL为menu:org.eclipse.ui.main.menu (注意,menu:org.eclipse.ui.main.menu为Eclipse标准菜单扩展位置),如下图

Eclipse RCP开发3--菜单、工具栏

 

    在menuContribution添加一个menu,设置label为“测试菜单二”,id为“testMenu2”,再在它下面添加一个command,设置commandId为org.test.menu_toolbar.commands.testCmd(即刚才添加的command),如下图Eclipse RCP开发3--菜单、工具栏     运行,如下图

Eclipse RCP开发3--菜单、工具栏

    将这个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),如下图

Eclipse RCP开发3--菜单、工具栏

    执行,结果如下图

Eclipse RCP开发3--菜单、工具栏

 

    在工具栏上出现了我们所添加的command。

 

    我们可以看到用actionSets和commands都可以添加菜单和工具栏,但是后者比前者更加优美(见 前一篇)。所以我推荐使用后者。

    另外,使用配置和代码混合编写可能有时候会更加方便。Eclipse中许多Action都可以被重用,如退出程序、显示透视图对话框等,我们可以灵活应用。