GEF入门实例_总结_03_显示菜单和工具栏

简介: 一、前言 本文承接上一节: GEF入门实例_总结_02_新建初始RCP空项目 这一节,我们来给我们的插件加上菜单。   二、基础知识 1.action bar、menubar、coolbar   含义 action bar 操作条 action 动作。

一、前言

本文承接上一节: GEF入门实例_总结_02_新建初始RCP空项目

这一节,我们来给我们的插件加上菜单。

 

二、基础知识

1.action bar、menubar、coolbar

  含义
action bar 操作条
action 动作。单击菜单、工具栏图标按钮或者按键时执行某项处理
menubar 菜单栏
coolbar 工具栏

 

 

2.菜单在哪里加

还记得上一节我们新建的类: ApplicationActionBarAdvisor 吗,这个类继承自 ActionBarAdvisor。

我们打开 ActionBarAdvisor 源码,看看它的类注释:

/**
 * Public base class for configuring the action bars of a workbench window.
 * <p>
 * An application should declare a subclass of <code>ActionBarAdvisor</code>
 * and override methods to configure a window's action bars to suit the needs of the
 * particular application.

 

翻译过来就是:

(1) 用于配置工作台窗口的 action bars 的公共基类。

(2) 应用程序应该声明ActionBarAdvisor的子类和重写方法,以配置窗口的 action bar 来满足特定应用程序的需要。

 

也就是说,我们需要在 ApplicationActionBarAdvisor  类中,通过重写父类的方法,来填充菜单栏。

 

3.菜单怎么加

注意到我们在第一节中为 ApplicationActionBarAdvisor 类重写了三个方法,就是为这里准备的。

 

方法名 作用
makeActions 生成并注册Action。Action只有注册后才能添加到菜单中
fillMenuBar 填充菜单栏。用Action来填充菜单
fillCoolBar 填充工具栏。用Action来填充工具栏

 

三、准备Action

1、图片

请前往GitHub下载源码,拷贝图片到此工程的icons文件夹下。   传送门:GEF入门实例_总结_01_教程、源码、开发环境准备

注:

Eclipse插件开发时,图片都默认保存在icons文件夹中,请不要修改文件夹名称。

 

2、图片常量类 IImageConstant

在包 constant 下新建图片常量类 IImageConstant ,用来集中管理程序中用到的图片资源。

package gef.tutorial.step.constant;

public interface IImageConstant {

    public static final String EDITORTITLE = "icons/example.gif";

    public static final String NEWHELLOMODEL = "icons/newModel.gif";

    public static final String NEWCONNECTION = "icons/newConnection.gif";

    public static final String ARROWCONNECTION = "icons/arrowConnection.gif";
    

}
View Code

 

 

3、DiagramAction

准备一个Action,它的动作就是:点击的时候,打开一个文件对话框。

新建一个 DiagramAction,

package gef.tutorial.step.action;


import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.ui.IWorkbenchWindow;

import gef.tutorial.step.app.Activator;
import gef.tutorial.step.constant.IImageConstant;

/**
 * DiagramAction
 * 
 * @author shirayner
 *
 */
public class DiagramAction extends Action {
    private final IWorkbenchWindow window;
    public final static String ID = "gef.tutorial.step.action.DiagramAction";

    /**
     * 一、在构造方法中设置基本属性
     * 
     * @param window
     */
    public DiagramAction(IWorkbenchWindow window) {
        this.window = window;

        //1.定义该Action的ID.  每一个Action需要一个唯一的ID号
        setId(ID);

        //2.设置该Action的文字。该文字也就是菜单上的文字。"@ALT+D"用来设置该Action的快捷键
        setText("&Diagram@ALT+D");

        //3.设置工具栏的提示文本
        setToolTipText("Draw the GEF diagram.");

        //4.设置该Action的图片。该方法使用 AbstractUIPlugin 抽象类的 imageDescriptorFromPlugin() 方法快捷地获取图像。
        //imageDescriptorFromPlugin()方法需要两个参数:项目ID、图片文件名。
        setImageDescriptor(Activator.imageDescriptorFromPlugin( Activator.PLUGIN_ID, IImageConstant.EDITORTITLE));

    }




    /**
     * 二、在Run方法中设置要执行的动作。
     * 单击菜单、工具栏图标按钮或者按键时会执行Action的run方法
     * 
     */
    @Override
    public void run() {
        String path = openFileDialog();
        if (path != null) {
            //弹出一个对话框
            MessageDialog.openInformation(window.getShell(), "温馨提示", "文件保存路径为:"+path);
        }
        
    }

    
    /** 打开一个文件对话框
     * 
     * @return
     *   String  文件路径
     */
    private String openFileDialog(){
        FileDialog dialog = new FileDialog(window.getShell(),SWT.OPEN);
        dialog.setText("文件保存到");
        dialog.setFilterExtensions(new String[] { ".diagram" });
        return dialog.open();
    }



}
View Code

 

四、填充菜单和工具栏

1. ApplicationActionBarAdvisor

接下来我们将要重写 ApplicationActionBarAdvisor  的三个方法来填充菜单和工具栏。

 

package gef.tutorial.step.app;

import org.eclipse.jface.action.ICoolBarManager;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.swt.SWT;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;

import gef.tutorial.step.action.DiagramAction;

public class ApplicationActionBarAdvisor extends ActionBarAdvisor {

    
    private IWorkbenchAction exitAction;
    private IWorkbenchAction aboutAction;
    private DiagramAction diagramAction;
    
    
    public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
        super(configurer);
    }

    
    /**
     * 1.生成并注册Action。Action只有注册后才能添加到菜单中。
     * 
     */
    @Override
    protected void makeActions(IWorkbenchWindow window) {
        //退出
        exitAction = ActionFactory.QUIT.create(window);
        register(exitAction);
        
        //关于
        aboutAction = ActionFactory.ABOUT.create(window);
        register(aboutAction);
        
        //绘图
        diagramAction = new DiagramAction(window);
        register(diagramAction);

    }

    

    /**
     * 2.填充菜单栏。用Action来填充菜单
     * 
     *  (1) 菜单管理器负责管理菜单项、设置菜单行为、创建级联菜单或者对菜单项进行分组。
     *  (2) MenuManager构造函数:菜单项文本、菜单项ID
     *  (3) new Separator() 为一条分割线
     */
    @Override
    protected void fillMenuBar(IMenuManager menuBar) {
        //(1)一级菜单  File
        MenuManager fileMenuManager= new MenuManager("File", "fileMenuManager");
        //加入绘图动作,是叶子节点菜单,也是二级菜单。点击之后将执行Action的run方法
        fileMenuManager.add(diagramAction);
        //加入分隔符
        fileMenuManager.add(new Separator());
        //加入退出动作
        fileMenuManager.add(exitAction);
        
        //(2)一级菜单  Help
        MenuManager helpMenuManager = new MenuManager("Help", "helpMenuManager");
        helpMenuManager.add(aboutAction);
        //加入二级菜单
        helpMenuManager.add(fileMenuManager);
        
        //(3)将菜单加入菜单栏
        menuBar.add(fileMenuManager);
        menuBar.add(helpMenuManager);

    }
    
    


    /**
     * 3.填充工具栏。用Action来填充工具栏
     * (1) 工具栏默认是不显示。在 ApplicationWorkbenchWindowAdvisor 类中的
     *  preWindowOpen方法中有一句 configurer.setShowCoolBar(false);将false改为true即可显示工具栏
     * (2) 工具栏管理器负责工具栏的分类管理
     * (3) SWT.FLAT将工具栏设置成平滑方式,SWT.SHADOW_OUT用于在工具栏和菜单栏之间加一条分割线
     * 
     */
    @Override
    protected void fillCoolBar(ICoolBarManager coolBar) {
        //1.生成工具栏
        ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT | SWT.SHADOW_OUT);
        
        //2.将工具放入工具栏
        toolBarManager.add(diagramAction);
        
        
        //3.将工具栏放入 
        coolBar.add(toolBarManager);
    }

    
}
View Code

 

 

2.设置显示工具栏

在 ApplicationWorkbenchWindowAdvisor 类中的 preWindowOpen方法中有一句 configurer.setShowCoolBar(false);   

将false改为true即可显示工具栏

ApplicationWorkbenchWindowAdvisor 

package gef.tutorial.step.app;

import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchWindowAdvisor;

public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {

    public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
        super(configurer);
    }
    
    @Override
    public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {
        return new ApplicationActionBarAdvisor(configurer);
    }
    
    @Override
    public void preWindowOpen() {
        IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
        //1.设置窗口初始化大小
        configurer.setInitialSize(new Point(700, 550));
        
        //2.显示工具栏
        configurer.setShowCoolBar(true);
        
        //3.不显示状态栏
        configurer.setShowStatusLine(false);
        
        //4.设置窗口标题
        configurer.setTitle("GEF入门实例"); //$NON-NLS-1$
    }
}
View Code

 

五、效果图

(1)现在运行程序,看到菜单栏File、Help ,已经加上去了,工具栏也加上去了。

但是 Run、Search 是什么鬼。这里我查了好久,都没发现是什么问题,希望读者能为我解惑!

 

 

 

(2)点击 子菜单diagram 出现下图文本对话框。

 

 (3)点击打开之后

 

 

六、异常

1.多出来的Run、Search菜单项

(1)异常现象

运行程序后,发现多出了Run、Search菜单项

(2)异常解决

参考资料:Remove Eclipse’s top menus

添加如下扩展点可隐藏Run菜单

 <extension
         point="org.eclipse.ui.perspectiveExtensions">
      <perspectiveExtension
            targetID="gef.tutorial.step.perspective">
         <hiddenMenuItem
               id="org.eclipse.ui.run">
         </hiddenMenuItem>
      </perspectiveExtension>
   </extension>
View Code

 

 

目录
相关文章
《QT从基础到进阶·九》菜单,菜单栏,工具栏创建
《QT从基础到进阶·九》菜单,菜单栏,工具栏创建
62 0
|
Java
swing做一个简单的记事本(有菜单的样式、右键弹出菜单、以及实现“新建”和“打开”功能)
swing做一个简单的记事本(有菜单的样式、右键弹出菜单、以及实现“新建”和“打开”功能)
342 0
swing做一个简单的记事本(有菜单的样式、右键弹出菜单、以及实现“新建”和“打开”功能)
|
搜索推荐
PyQt5 技巧篇-参数控制窗体右上角只显示关闭按钮实例演示
PyQt5 技巧篇-参数控制窗体右上角只显示关闭按钮实例演示
574 0
PyQt5 技巧篇-参数控制窗体右上角只显示关闭按钮实例演示
|
前端开发
JavaWeb 省市级菜单如何被选中
JavaWeb 省市级菜单如何被选中
125 0
JavaWeb 省市级菜单如何被选中
|
测试技术
MFC中为菜单或按钮添加快捷键功能
1、新建一快捷键资源,ACCELERATOR,关联相应的ID号,下图所示中,其中,第一个ID为自定义快捷键ID,按CTRL+R,此时响应该ID以应的消息响应函数, 第二个ID为菜单ID,此时按CTRL+V,调出ID_NETWORK_PING菜单对应的响应函数。
1373 0
创建动态工具栏并设置工具栏按钮提示
1、创建对话框程序,导入8个图标资源。 2、在对话框头文件中声明变量,代码如下: CToolBar m_ToolBar; CImageList m_ImageList; CString  m_TipText;   3、在对话框中oninitdialg函数中创建工具栏,如下: //创建图像列表 m_ImageList.
964 0
点击abap的选择屏幕工具栏按钮下载excel模板
自己编写一个report,分配了事务码以后,执行该事务码,在选择屏幕界面看到一个按钮,点击这个按钮,就可以将预先上传至sap服务器的excel文件下载到本地。服务器上的excel文件是预先通过事务码SMW0上传到SAP服务器系统的:选择包,然后执行,看看里面有什么如下图,就是目前SAP系统中存在的e.
2818 0
|
图形学
Unity3D初识---窗口和菜单基础介绍
目录 目录 窗口界面介绍: scene: Game : Hierarchy: Project: Inspector: 其他窗口: 菜单界面 File文件菜单 Edit编辑菜单 窗口界面介绍: scene: 在场景编译窗口中可以鼠标右键选中之后移动鼠标就可以自由的浏览场景,并选择物体对其可以进行操作,按下Q\W\E\R四个键时可以画面中的将会进行变换,第一个图标可以进行拖动、第二个图标可以对物体进行位移,第三个图标可以对物体进行旋转,第四个图标可以对物体进行放大缩小。
1292 0
GEF入门实例_总结_05_显示一个空白编辑器
一、前言 本文承接上一节:GEF入门实例_总结_04_Eclipse插件启动流程分析 在第三节( GEF入门实例_总结_03_显示菜单和工具栏  ),我们创建了菜单和工具栏。 这一节,我们来实现:点击菜单后,打开一个编辑器。
1494 0