Eclipse RCP开发桌面程序

时间:2023-01-12 12:15:32
随笔-251  评论-86  文章-3  trackbacks-3

Eclipse RCP开发桌面程序

所谓RCP,就是Rich Client Platform的缩写,即富客户平台,是Eclipse进化的产物(自3.0版以后出现),是Eclipse组织向用户提供的强大的开放性开发平台,能够使用户方便地创建自己的基于Eclipse的应用程序,并且这些应用程序能够得到Eclipse的底层支持。更重要的是,我们可以利用Java创建象Eclipse这么漂亮的桌面程序。

  我相信,在未来的几年里,RCP一定会变得非常流行。使用RCP,我们可以开发界面象Eclipse这样漂亮的桌面程序,比如医院管理系统啊、CAD软件等等。遗憾的是,目前在国内基本上找不到关于RCP的中文资料,我们只能通过自己的探索来为我们的程序添加我们想要的功能。

  下面让我们一步一步来建立一个Eclipse RCP程序,下面的内容可以说在Google上一搜一大把,有些人会觉得乏味,但是没关系,这只是一个快速的起步。

  选择“新建--项目”,选择“插件项目”:
Eclipse RCP开发桌面程序

Eclipse RCP开发桌面程序

点下一步,输入项目名称,选择Eclipse版本,我这里选择的是3.2:
Eclipse RCP开发桌面程序

  点下一步,插件标识和插件名称可以更改,其他的内容都可以保持默认,一定要记得选中富客户机应用程序支持:
Eclipse RCP开发桌面程序

  点下一步,选中一个模板,这里选一个最简单的,到时候看源代码的时候便于理解:
Eclipse RCP开发桌面程序

  点下一步,改一下应用程序标题:
Eclipse RCP开发桌面程序

  点完成,我们可以在项目上面点右键,选择按Eclipse程序运行,就可以看到效果了:
Eclipse RCP开发桌面程序

Eclipse RCP开发桌面程序

  在这个程序中,窗口上显示的是一个透视图,透视图中含有一个编辑器区域,以后,我们可以逐步为这个程序添加菜单、工具条和为这个透视图添加视图、编辑器等等。

  现在,这个程序只能在Eclipse环境下运行,而RCP的目标是创建可以独立运行的应用程序,我们的事情还没完呢。下一步,在项目上点右键,创建产品配置文件:
Eclipse RCP开发桌面程序

  输入产品配置文件名:

Eclipse RCP开发桌面程序

  生成的产品配置文件在编辑器中打开,应该是这个样子的:
Eclipse RCP开发桌面程序

  刚开始,上面的几个文本框都是空的,点新建按钮之后,弹出如下的对话框,输入产品名称后,点完成就行了。

Eclipse RCP开发桌面程序

  点击配置文件中的“启动程序”,我们可以试着启动我们的RCP程序。结果呢,会出错。原因很简单,因为我们没有为我们的程序选中它依赖的插件。

   选中配置文件的“配置”选项卡,添加以下几个依赖项,记住,一定要把我们自己,也就是com.blogjava.youxia.rcp_start加进依赖项,否则会出错。最开始的时候,就是这么一点小问题,让我浪费了几天时间。
Eclipse RCP开发桌面程序

  再点击添加必须的插件,自动添加其它的依赖项。

  再下一步,设置项目的构建路径,如下图:
Eclipse RCP开发桌面程序

  下一步,导出我们的程序:
Eclipse RCP开发桌面程序

Eclipse RCP开发桌面程序

  点下一步,输入我们程序导出的目录,如下图:
Eclipse RCP开发桌面程序

  点完成按钮之后,我们的程序就导出到我们的指定的目录中了,打开这个目录,可以看到一个类似eclipse的程序图标,双击运行,效果如下图:Eclipse RCP开发桌面程序

  最后,需要说明两点:第一,如果希望生成的程序有自己的图标,可以在产品配置文件中的最后两个配置文件中设置;第二,生成的程序应该是没有菜单栏的,因为我的Eclipse安装了MyEclipse,所以导出的程序就多了两个菜单。

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

图一、图二:带有菜单和工具条的RCP程序
Eclipse RCP开发桌面程序

Eclipse RCP开发桌面程序

图三:工具栏上的按钮的提示文本
Eclipse RCP开发桌面程序

图四:点击菜单项或者工具栏按钮后,弹出一个简单的对话框。
Eclipse RCP开发桌面程序

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

打开我们上一节使用向导建立的工程,可以发现工程下面自动生成了如下文件:
Application.java
ApplicationWorkbenchAdvisor.java
ApplicationWorkbenchWindowAdvisor.java
ApplicationActionBarAdvisor.java
Perspective.java
plugin.xml
这里的Application.java是我们整个程序的入口点,我们的程序运行的时候,会先执行Application的run方法,run方法的代码如下:

 1   Eclipse RCP开发桌面程序  public    Object run(Object args)    throws    Exception    {
 2 Eclipse RCP开发桌面程序        Display display  =  PlatformUI.createDisplay();
 3 Eclipse RCP开发桌面程序          try   {
 4 Eclipse RCP开发桌面程序             int  returnCode  =  PlatformUI.createAndRunWorkbench(display,  new  ApplicationWorkbenchAdvisor());
 5 Eclipse RCP开发桌面程序              if  (returnCode  ==  PlatformUI.RETURN_RESTART)  {
 6 Eclipse RCP开发桌面程序                 return  IPlatformRunnable.EXIT_RESTART;
 7 Eclipse RCP开发桌面程序            } 

 8 Eclipse RCP开发桌面程序             return  IPlatformRunnable.EXIT_OK;
 9 Eclipse RCP开发桌面程序         } 
  finally   {
10 Eclipse RCP开发桌面程序            display.dispose();
11 Eclipse RCP开发桌面程序        } 

12 Eclipse RCP开发桌面程序    }

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

 1   Eclipse RCP开发桌面程序  public       class    ApplicationWorkbenchAdvisor    extends    WorkbenchAdvisor    {
 2 Eclipse RCP开发桌面程序 
 3 Eclipse RCP开发桌面程序     private   static   final  String PERSPECTIVE_ID  =   " cn.blogjava.youxia.rcp_start.perspective " ;
 4 Eclipse RCP开发桌面程序 
 5 Eclipse RCP开发桌面程序      public  WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer)  {
 6 Eclipse RCP开发桌面程序         return   new  ApplicationWorkbenchWindowAdvisor(configurer);
 7 Eclipse RCP开发桌面程序    } 

 8 Eclipse RCP开发桌面程序 
 9 Eclipse RCP开发桌面程序      public  String getInitialWindowPerspectiveId()  {
10 Eclipse RCP开发桌面程序         return  PERSPECTIVE_ID;
11 Eclipse RCP开发桌面程序    } 

12 Eclipse RCP开发桌面程序}

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

 1   Eclipse RCP开发桌面程序  public       class    ApplicationWorkbenchWindowAdvisor    extends    WorkbenchWindowAdvisor    {
 2 Eclipse RCP开发桌面程序 
 3 Eclipse RCP开发桌面程序      public  ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer)  {
 4 Eclipse RCP开发桌面程序         super (configurer);
 5 Eclipse RCP开发桌面程序    } 

 6 Eclipse RCP开发桌面程序 
 7 Eclipse RCP开发桌面程序      public  ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer)  {
 8 Eclipse RCP开发桌面程序         return   new  ApplicationActionBarAdvisor(configurer);
 9 Eclipse RCP开发桌面程序    } 

10 Eclipse RCP开发桌面程序    
11 Eclipse RCP开发桌面程序      public   void  preWindowOpen()  {
12 Eclipse RCP开发桌面程序        IWorkbenchWindowConfigurer configurer  =  getWindowConfigurer();
13 Eclipse RCP开发桌面程序        configurer.setInitialSize( new  Point( 600  450 ));
14 Eclipse RCP开发桌面程序        configurer.setShowCoolBar( true );
15 Eclipse RCP开发桌面程序        configurer.setShowStatusLine( false );
16 Eclipse RCP开发桌面程序        configurer.setTitle( " 第一个RCP程序 " );
17 Eclipse RCP开发桌面程序        
18 Eclipse RCP开发桌面程序    } 

19 Eclipse RCP开发桌面程序       
20 Eclipse RCP开发桌面程序}

这个类的功能很强大,我们可以重载它的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开发桌面程序  package    cn.blogjava.youxia.rcp_start;
 2   Eclipse RCP开发桌面程序 
 3   Eclipse RCP开发桌面程序  import    org.eclipse.jface.action.IMenuManager;
 4   Eclipse RCP开发桌面程序  import    org.eclipse.jface.action.MenuManager;
 5   Eclipse RCP开发桌面程序  import    org.eclipse.ui.IWorkbenchWindow;
 6   Eclipse RCP开发桌面程序  import    org.eclipse.ui.application.ActionBarAdvisor;
 7   Eclipse RCP开发桌面程序  import    org.eclipse.ui.application.IActionBarConfigurer;
 8   Eclipse RCP开发桌面程序  import    org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
 9   Eclipse RCP开发桌面程序  import    cn.blogjava.youxia.actions.Action1;
10   Eclipse RCP开发桌面程序 
11   Eclipse RCP开发桌面程序  public       class    ApplicationActionBarAdvisor    extends    ActionBarAdvisor    {
12 Eclipse RCP开发桌面程序    
13 Eclipse RCP开发桌面程序     private  IWorkbenchAction action1;
14 Eclipse RCP开发桌面程序 
15 Eclipse RCP开发桌面程序      public  ApplicationActionBarAdvisor(IActionBarConfigurer configurer)  {
16 Eclipse RCP开发桌面程序         super (configurer);
17 Eclipse RCP开发桌面程序    } 

18 Eclipse RCP开发桌面程序 
19 Eclipse RCP开发桌面程序      protected   void  makeActions(IWorkbenchWindow window)  {
20 Eclipse RCP开发桌面程序        action1  =   new  Action1(window);
21 Eclipse RCP开发桌面程序        action1.setText( " 第一个菜单项 " );
22 Eclipse RCP开发桌面程序        action1.setId( " cn.blogjava.youxia.actions.action1 " );
23 Eclipse RCP开发桌面程序        register(action1);
24 Eclipse RCP开发桌面程序    } 

25 Eclipse RCP开发桌面程序 
26 Eclipse RCP开发桌面程序      protected   void  fillMenuBar(IMenuManager menuBar)  {
27 Eclipse RCP开发桌面程序        MenuManager newMenu  =   new  MenuManager( " 第一个菜单 " , " cn.blogjava.youxia.firstmenu " );
28 Eclipse RCP开发桌面程序        menuBar.add(newMenu);
29 Eclipse RCP开发桌面程序        newMenu.add(action1);
30 Eclipse RCP开发桌面程序    } 

31 Eclipse RCP开发桌面程序   
32 Eclipse RCP开发桌面程序}

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

下面请看Action1类的源代码:

 1   Eclipse RCP开发桌面程序  package    cn.blogjava.youxia.actions;
 2   Eclipse RCP开发桌面程序 
 3   Eclipse RCP开发桌面程序  import    org.eclipse.jface.action.Action;
 4   Eclipse RCP开发桌面程序  import    org.eclipse.ui.IWorkbenchWindow;
 5   Eclipse RCP开发桌面程序  import    org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
 6   Eclipse RCP开发桌面程序  import    cn.blogjava.youxia.rcp_start.FirstDialog;
 7   Eclipse RCP开发桌面程序 
 8   Eclipse RCP开发桌面程序 
 9   Eclipse RCP开发桌面程序  public       class    Action1    extends    Action    implements    IWorkbenchAction    {
10 Eclipse RCP开发桌面程序    
11 Eclipse RCP开发桌面程序     private  IWorkbenchWindow workbenchWindow;
12 Eclipse RCP开发桌面程序 
13 Eclipse RCP开发桌面程序      public  Action1(IWorkbenchWindow window)  {
14 Eclipse RCP开发桌面程序          if  (window  ==   null  {
15 Eclipse RCP开发桌面程序             throw   new  IllegalArgumentException();
16 Eclipse RCP开发桌面程序        } 

17 Eclipse RCP开发桌面程序 
18 Eclipse RCP开发桌面程序         this .workbenchWindow  =  window;
19 Eclipse RCP开发桌面程序    } 

20 Eclipse RCP开发桌面程序    
21 Eclipse RCP开发桌面程序      public   void  run()  {
<span style%