在​​使用Eclipse RCP进行桌面程序开发(一):快速起步​​中,我们通过Eclipse的插件开发向导,逐步建立了一个RCP应用程序,但是,这个程序没有任何功能,难以激起我们学习的兴趣。在这一节,我们将一起探索怎样在程序中添加菜单和工具条。先看一下成果:

图一、图二:带有菜单和工具条的RCP程序

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse


使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_02

图三:工具栏上的按钮的提示文本

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_03

图四:点击菜单项或者工具栏按钮后,弹出一个简单的对话框。

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_04

这里需要说明一点,为什么要在讲菜单和工具栏的时候一起讲对话框,这是因为对话框是我们所能想到的最简单最直接的用户交互方式,在对话框上可以 添加各种各样的控件来实现复杂的功能,为了让我们点击菜单项的时候能够看到效果,这里就用了一个简单的对话框。当然,当我们以后接触到视图、编辑器和透视 图这样的概念之后,我们能使用的用户交互方式就不仅仅只是对话框了。

打开我们上一节使用向导建立的工程,可以发现工程下面自动生成了如下文件:

Application.java

ApplicationWorkbenchAdvisor.java

ApplicationWorkbenchWindowAdvisor.java

ApplicationActionBarAdvisor.java

Perspective.java

plugin.xml

这里的Application.java是我们整个程序的入口点,我们的程序运行的时候,会先执行Application的run方法,run方法的代码如下:

 1 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_05public  Object run(Object args)  throws  Exception 

{

 2 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        Display display 

=  PlatformUI.createDisplay();

 3 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

         try   {

 4 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06            

int  returnCode  =  PlatformUI.createAndRunWorkbench(display,  new  ApplicationWorkbenchAdvisor());

 5 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

             if  (returnCode  ==  PlatformUI.RETURN_RESTART)  {

 6 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06                

return  IPlatformRunnable.EXIT_RESTART;

 7 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11            }


 8 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06            

return  IPlatformRunnable.EXIT_OK;

 9 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

        }   finally   {

10 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06            display.dispose();

11 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11        }


12 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_16    }

在第4行我们可以看出,该入口函数将创建用户界面的工作交给了ApplicationWorkbenchAdvisor类。接着,我们打开ApplicationWorkbenchAdvisor.java,代码如下:

 1 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_05public   class  ApplicationWorkbenchAdvisor  extends  WorkbenchAdvisor 

{

 2 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

 3 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06    

private   static   final  String PERSPECTIVE_ID  =   " cn.blogjava.youxia.rcp_start.perspective " ;

 4 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

 5 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

     public  WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer)  {

 6 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        

return   new  ApplicationWorkbenchWindowAdvisor(configurer);

 7 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11    }


 8 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

 9 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

     public  String getInitialWindowPerspectiveId()  {

10 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        

return  PERSPECTIVE_ID;

11 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11    }


12 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_16}

可以看出,这个类的工作就是为我们的程序指定默认的透视图,然后把创建窗口的工作交给了 ApplicationWorkbenchWindowAdvisor类。接着,我们打开 ApplicationWorkbenchWindowAdvisor.java文件,看到代码如下:

 1 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_05public   class  ApplicationWorkbenchWindowAdvisor  extends  WorkbenchWindowAdvisor 

{

 2 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

 3 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

     public  ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer)  {

 4 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        

super (configurer);

 5 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11    }


 6 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

 7 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

     public  ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer)  {

 8 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        

return   new  ApplicationActionBarAdvisor(configurer);

 9 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11    }


10 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06    

11 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

     public   void  preWindowOpen()  {

12 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        IWorkbenchWindowConfigurer configurer 

=  getWindowConfigurer();

13 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        configurer.setInitialSize(

new  Point( 600 ,  450 ));

14 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        configurer.setShowCoolBar(

true );

15 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        configurer.setShowStatusLine(

false );

16 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        configurer.setTitle(

" 第一个RCP程序 " );

17 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        

18 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11    }


19 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06       

20 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_16}

这个类的功能很强大,我们可以重载它的preWindowCreate、postWindowCreate、preWindowOpen、 postWindowOpen等方法,以便修改我们窗口的外观。在这里可以看出,我们重载了preWindowOpen方法来设置窗口的大小和让工具栏可 见。很显然,这个类的另外一个功能,就是把创建菜单和工具栏的任务交给了ApplicationActionBarAdvisor类。

到这里,谜底已经揭晓,要创建我们自己的菜单和工具条,就一定是在ApplicationActionBarAdvisor.java中做文章了。不错,打开这个文件,我们可以看到这个类有两个重要的方法:

protected void makeActions(IWorkbenchWindow window);

protected void fillMenuBar(IMenuManager menuBar);

我 们可以在makeActions方法中创建我们的Action,什么是Action呢?Action是jface中的一个概念,在jface中通过 org.eclipse.jface.action中的Action和ActionContributionItem类实现了视图和处理代码的分离,这样 无论何时用户触发了一个控件的事件,都会激活一个相应的Action类实例来进行时间处理。毫无疑问,我们的菜单项是一个Action类的子类了。

下面请看ApplicationActionBarAdvisor.java的源代码:

 1 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49package  cn.blogjava.youxia.rcp_start;

 2

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49

 3

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.jface.action.IMenuManager;

 4

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.jface.action.MenuManager;

 5

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.ui.IWorkbenchWindow;

 6

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.ui.application.ActionBarAdvisor;

 7

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.ui.application.IActionBarConfigurer;

 8

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;

 9

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  cn.blogjava.youxia.actions.Action1;

10

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49

11

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_05 public   class  ApplicationActionBarAdvisor  extends  ActionBarAdvisor 

{

12 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06    

13 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06    

private  IWorkbenchAction action1;

14 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

15 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

     public  ApplicationActionBarAdvisor(IActionBarConfigurer configurer)  {

16 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        

super (configurer);

17 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11    }


18 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

19 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

     protected   void  makeActions(IWorkbenchWindow window)  {

20 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        action1 

=   new  Action1(window);

21 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        action1.setText(

" 第一个菜单项 " );

22 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        action1.setId(

" cn.blogjava.youxia.actions.action1 " );

23 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        register(action1);

24 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11    }


25 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

26 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

     protected   void  fillMenuBar(IMenuManager menuBar)  {

27 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        MenuManager newMenu 

=   new  MenuManager( " 第一个菜单 " , " cn.blogjava.youxia.firstmenu " );

28 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        menuBar.add(newMenu);

29 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        newMenu.add(action1);

30 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11    }


31 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06   

32 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_16}

可以看出,我们通过创建cn.blogjava.youxia.actions.Action1类的实例来创建一个菜单项,然后把它加入到菜单 newMenu中,然后再把newMenu加入menuBar中,整个过程很容易理解。那么register(action1)是做什么的呢?这是为了把 我们的Action的实例注册到工作台中,这样当我们的工作台销毁的时候,我们的Action也可以被销毁。

下面请看Action1类的源代码:

 1 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49package  cn.blogjava.youxia.actions;

 2

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49

 3

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.jface.action.Action;

 4

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.ui.IWorkbenchWindow;

 5

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;

 6

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  cn.blogjava.youxia.rcp_start.FirstDialog;

 7

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49

 8

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49

 9

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_05 public   class  Action1  extends  Action  implements  IWorkbenchAction 

{

10 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06    

11 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06    

private  IWorkbenchWindow workbenchWindow;

12 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

13 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

     public  Action1(IWorkbenchWindow window)  {

14 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

         if  (window  ==   null )  {

15 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06            

throw   new  IllegalArgumentException();

16 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11        }


17 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

18 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        

this .workbenchWindow  =  window;

19 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11    }


20 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06    

21 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

     public   void  run()  {

22 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        

//  make sure action is not disposed

23 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

         if  (workbenchWindow  !=   null )  {

24 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06            

// 在这里添加功能

25 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

            FirstDialog dg  =   new  FirstDialog(workbenchWindow.getShell());

26 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06            dg.open();

27 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06            

28 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11        }


29 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11    }


30 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

31 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

     public   void  dispose()  {

32 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        workbenchWindow 

=   null ;

33 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

34 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11    }


35 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

36 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_16}

在构造函数中保存我们工作台窗口的引用,在run方法中执行功能,是不是很简单?在这里,我们用到了一个对话框类 cn.blogjava.youxia.rcp_start.FirstDialog,这个类从 org.eclipse.swt.widgets.Dialog类继承,熟悉swt的朋友一定不会陌生。我建议大家可以使用Designer插件,这个插 件对swt/jface提供非常好的可视化支持,在这个对话框中,我们只简单的添加了两个按钮。

FirstDialog.java源文件如下:

 1 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49package  cn.blogjava.youxia.rcp_start;

 2

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49

 3

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.swt.SWT;

 4

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.swt.events.SelectionAdapter;

 5

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.swt.events.SelectionEvent;

 6

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.swt.widgets.Button;

 7

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.swt.widgets.Dialog;

 8

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.swt.widgets.Display;

 9

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.swt.widgets.Shell;

10

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49

11

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49

12

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_05 public   class  FirstDialog  extends  Dialog 

{

13 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

14 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06    

protected  Shell shell;

15 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06    

16 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06    

private   int  result;

17 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

18 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

     public  FirstDialog(Shell parent,  int  style)  {

19 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        

super (parent, style);

20 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11    }


21 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

22 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

     public  FirstDialog(Shell parent)  {

23 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        

this (parent, SWT.NONE);

24 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11    }


25 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

26 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

     public   int  open()  {

27 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        createContents();

28 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        shell.open();

29 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        shell.layout();

30 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        Display display 

=  getParent().getDisplay();

31 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

         while  ( ! shell.isDisposed())  {

32 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06            

if  ( ! display.readAndDispatch())

33 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06                display.sleep();

34 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11        }


35 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        

return  result;

36 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11    }


37 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

38 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

     protected   void  createContents()  {

39 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        shell 

=   new  Shell(getParent(), SWT.DIALOG_TRIM  |  SWT.APPLICATION_MODAL);

40 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        shell.setSize(

150 ,  70 );

41 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        shell.setText(

" 第一个对话框 " );

42 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

43 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        

final  Button okButton  =   new  Button(shell, SWT.NONE);

44 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

        okButton.addSelectionListener( new  SelectionAdapter()  {

45 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

             public   void  widgetSelected(SelectionEvent e)  {

46 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06                result 

=   1 ;

47 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06                shell.dispose();

48 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11            }


49 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11        }

);

50 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        okButton.setText(

" OK " );

51 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        okButton.setBounds(

10 ,  10 ,  48 ,  22 );

52 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

53 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        

final  Button cancelButton  =   new  Button(shell, SWT.NONE);

54 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

        cancelButton.addSelectionListener( new  SelectionAdapter()  {

55 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

             public   void  widgetSelected(SelectionEvent e)  {

56 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06                result 

=   2 ;

57 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06                shell.dispose();

58 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11            }


59 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11        }

);

60 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        cancelButton.setText(

" Cancel " );

61 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        cancelButton.setBounds(

89 ,  10 ,  48 ,  22 );

62 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11    }


63 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

64 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_16}


65

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49

上面所讲的,只是添加菜单和工具栏的第一种方法,这种方法把构建菜单的工作以静态代码的方式加入到了ApplicationActionBarAdvisor类中,如果需要修改用户界面,则需要修改代码并重新编译。

添加菜单项的第二种方法就要简单得多,而且修改起来也方便,还可以对菜单项实现更加灵活的控制,但是,需要对Eclipse的插件基础有比较好的了解。那这第二种方法就是通过扩展actionSets扩展点来添加菜单。

对扩展点的扩展,可以通过编辑plugin.xml文件了实现,比如我们添加的第二个菜单项,其配置文件如下:


 1 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49< extension

 2

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49          id ="cn.blogjava.youxia.actionset"


 3

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49         name ="我的菜单扩展"


 4

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49         point ="org.eclipse.ui.actionSets" >


 5

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49       < actionSet

 6

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49             description ="第一个扩展"


 7

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49            id ="RCP_Start.actionSet1"


 8

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49            label ="RCP_Start.actionSet1"


 9

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49            visible ="true" >


10

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49          < action

11

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49                class ="cn.blogjava.youxia.actions.Action2"


12

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49               icon ="icons/alt_window_16.gif"


13

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49               id ="RCP_Start.action2"


14

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49               label ="第二个菜单项"


15

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49               menubarPath ="cn.blogjava.youxia.firstmenu/additions"


16

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49               style ="push"


17

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49               toolbarPath ="additions"


18

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49               tooltip ="第二个菜单项的按钮" />


19

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49       </ actionSet >


20

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49    </ extension >

其实Eclipse为我们提供了很好的可视化plugin.xml的编辑器,如下图,我们可以对菜单的外观进行和行为进行灵活的控制:

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_202

从配置文件中我们可以看到,我们为这第二个菜单项指定的Action是cn.blogjava.youxia.actions.Action2 类,这个类我们必须实现org.eclipse.ui.IWorkbenchWindowActionDelegate接口,这个接口中比 org.eclipse.jface.actions.Action中多定义了一个方法public void selectionChanged(IAction action, ISelection selection),这个方法是必须的,以便工作台窗口在用户选定哪一项资源的时候通知我们的Action类的实例。其代码如下:

 1 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49package  cn.blogjava.youxia.actions;

 2

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49

 3

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.jface.action.IAction;

 4

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.jface.viewers.ISelection;

 5

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.ui.IWorkbenchWindow;

 6

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  org.eclipse.ui.IWorkbenchWindowActionDelegate;

 7

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49 import  cn.blogjava.youxia.rcp_start.FirstDialog;

 8

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_49

 9

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_05 public   class  Action2  implements  IWorkbenchWindowActionDelegate 

{

10 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06    

11 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06    

private  IWorkbenchWindow window;

12 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

13 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

     public   void  dispose()  {

14 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        

//  TODO 

15 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06


16 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11    }


17 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

18 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

     public   void  init(IWorkbenchWindow window)  {

19 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        

//  TODO 

20 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

         this .window  =  window;

21 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

22 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11    }


23 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

24 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

     public   void  run(IAction action)  {

25 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        

//  TODO 

26 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

        FirstDialog dg  =   new  FirstDialog(window.getShell());

27 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        dg.open();

28 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

29 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11    }


30 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

31 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_07

     public   void  selectionChanged(IAction action, ISelection selection)  {

32 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06        

//  TODO 

33 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06


34 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_11    }


35 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_eclipse_06

36 使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_java_16}

总结:通过向工作台中添加菜单和工具栏,并使用对话框作为与用户交互的基础,我们已经基本上可以构建功能比较复杂的程序了。但这仅仅只是RCP编程的开端。下一节,我们将一起探索Eclipse的透视图和视图。


作者:张锋

更多精彩文章可以观注

微信公众号

使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框_菜单项_239