zoukankan      html  css  js  c++  java
  • Eclipse RCP开发3菜单、工具栏

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

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

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

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

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

    image

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

    image     里面默认已经创建了两个扩展,我们点“添加”按钮,新建一个org.eclipse.ui.actionSets扩展,如下图所示

    image

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

    image

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

    image

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

    image

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

    image     该链接将打开一个创建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");

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

    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);
    }
     
    执行,结果如图所示
    image 

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

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

    image     新建一个command,id为org.test.menu_toolbar.commands.testCmd,name为“测试”,其他默认,如下图

    image

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

    image

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

    image

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

    image

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

    image

        在menuContribution添加一个menu,设置label为“测试菜单二”,id为“testMenu2”,再在它下面添加一个command,设置commandId为org.test.menu_toolbar.commands.testCmd(即刚才添加的command),如下图image     运行,如下图

    image

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

    image

        执行,结果如下图

    image

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

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

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


    作者:Alex Yu
    出处:http://www.cnblogs.com/biaoyu/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    C++ Vector
    难点目录
    学习图片展
    使用Github总结
    更改git bash默认的路径
    kubernetes dashboard 搭建参考
    vCenter 6.5 Appliance安装问题汇总
    转-Linux访问Windows FTP服务器中文乱码
    安装升级libpcap至1.9.0
    kubectl patch
  • 原文地址:https://www.cnblogs.com/biaoyu/p/1693334.html
Copyright © 2011-2022 走看看