浏览 7591 次
锁定老帖子 主题:rcp实践
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-12-20  
      这篇文章基本上是没怎么加我自己写的代码的,几乎全部是eclipse生成的,本人只是拿这个例子来说说自己的认识,所以里面很多错误,看了就把它忘记吧。建议到网站找资料,我想更适合你。

最近发现rcp的资料越来越多,而自己有处于比较有空的状态,所想写一篇完整的Rcp教程,由于我也是初学,所以写出来的很多东西可能都是错的,所以建议参考一些资料:<o:p></o:p>

http://www.eclipse.org/home/categories/rcp.php Eclipse Rcp的官方网站。<o:p></o:p>

http://www-128.ibm.com/developerworks/cn/opensource/top-projects/eclipse.html  IBM网站 Eclispe的帮助文档。<o:p></o:p>

上面的文档足以帮助我们这些初学者入门。<o:p></o:p>

<!----> <!----><o:p></o:p>

下面我将以一篇管理用户的例子来体验RCP的美妙,此程序基于(jdk1.5+eclipse3.2)。<o:p></o:p>

一.创建序基本框架<o:p></o:p>

二.分析RCP的结构<o:p></o:p>

三.添加程序功能<o:p></o:p>

四.建立数据modeldaoserviceaction<o:p></o:p>

五.测试<o:p></o:p>

六.打包

一.    序基本框架,我想Eclipse这点做的是很贴心的,在创建程序框架的时候选择Email Template。并输入项目名称org.wuhua.rcp。然后点下一步就行了。这样我们创建了带菜单,工具条等基本模板。


上面的模板我想基本上是适合我们的程序的,不过我们要改进下它们,比如菜单,工具条,跟左侧树状菜单,这些是我们要改进的,我们要让它们符合我们的需求。

二.    哇,上面的框架好漂亮啊。Eclipse是怎么做出来的。程序是怎么启动的?我怎么没有找到main方法呢?java不是要求从main启动的吗?那些图片,菜单,工具条,视图是怎么构建的呢?跟Swing,awt有区别吗?
带这这些问题我们来看看那些源代码是怎么工作的?
我们将三步来学习这些东西:
1,    插件清单――plugin.xml,MANIFEST.MF(OSGI绑定),build.properties。
2,    java代码――Perspective,ActionBarAdvisor, WorkbenchAdvisor,Application<o:p></o:p>

<!----> <o:p></o:p>

插件清单的学习:重点RCP程序也是一个插件,但跟插件又有点不同(它有自己独立的工作台,有自己独立的透视图,透视图在程序启动时候启动(可以自己指定相关的透视图实现)。要注意的是在相同的时间里只能存在一个透视图),我认为普通插件是构建在Eclipse的工作台之上的,说白了就是插件要依赖与Eclipse来工作,而RCP则可独立运行――纯粹个人观点。<o:p></o:p>

在创建了插件项目之后,需要创建透视图,创建透视图是一个两阶段的过程。首先,修改插件的清单以包含新的扩展,该扩展将使用 org.eclipse.ui.perspectives 扩展点。其次,使用来自新扩展点的属性创建一个透视图类。根据关于扩展和扩展点的早期讨论,AutoTest应用程序的插件清单已经包括下列扩展:<o:p></o:p>

  <extension></extension><o:p></o:p>

         point="org.eclipse.ui.perspectives"><o:p></o:p>

      <perspective></perspective> <o:p></o:p>

            name="Autotest Perspective"<o:p></o:p>

            class="org.wuhua.autotest.ui.Perspective"<o:p></o:p>

            id="org.wuhua.autotest.perspective"><o:p></o:p>

      <o:p></o:p>

  <o:p></o:p>

<perspective></perspective> 元素具有下列属性:<o:p></o:p>

  • id —— 该属性为透视图定义了一个惟一标识符。 <o:p></o:p>
  • name —— 该属性为透视图定义了一个名称,工作台窗口菜单栏将使用它来表示该透视图。 <o:p></o:p>
  • class —— 该属性包含实现 org.eclipse.ui.IPerspectiveFactory 接口的类的完全限定名。 <o:p></o:p>

<o:p></o:p>

上面是对透视图插件清单的定义,现在我们看下,透视图在java代码中是怎么样构建的,是怎么样显示到桌面?看看下面的代码<o:p></o:p>

java 代码
 
  1. public class Perspective implements IPerspectiveFactory {  
  2.     public void createInitialLayout(IPageLayout layout) {  
  3.     }  
  4. }  

IperspectiveFactory指定一个创建透视图接口,我们只需要实现它即可。程序会在启动的时候加载这个类,具体是通过plugin.xml里面的扩展点:
<extension></extension> point="org.eclipse.ui.perspectives">――个人认为:我们可以把RCP启动框架OSGI相当于Spring IOC容器,通过配置文件加载并管理各个方面的资源。<o:p></o:p>

<!----> <!----><o:p></o:p>

具体创建透视图的方法是:


java 代码
 
  1. public void createInitialLayout(IPageLayout layout) {  
  2.     String editorArea = layout.getEditorArea();  
  3.         layout.setEditorAreaVisible(false);  
  4.           
  5.         layout.addStandaloneView(NavigationView.ID,  false, IPageLayout.LEFT, 0.25f, editorArea);  
  6.         IFolderLayout folder = layout.createFolder("messages", IPageLayout.TOP, 0.5f, editorArea);  
  7.         folder.addPlaceholder(View.ID + ":*");  
  8.         folder.addView(View.ID);  
  9.           
  10.         layout.getViewLayout(NavigationView.ID).setCloseable(false);  
  11. }  

 

我们可以在里面部署我们的透视图,比如透视图开始位置,大小,是否可见等――系统通过传入IpageLayout 对象,然后通过这个对象来实现上面的功能。<o:p></o:p>

介绍 WorkbenchAdvisor<o:p></o:p>

前面集中讨论了构成 RCP 应用程序的各种组件。接下来将集中讨论如何将所有的事物结合到一起。在构建 RCP 应用程序时,核心任务之一就是创建一个实现抽象类 org.eclipse.ui.application.WorkbenchAdvisor 的类。WorkbenchAdvisor 类负责配置工作台,当执行 RCP 应用程序时,将显示该工作台。<o:p></o:p>

WorkbenchAdvisor 类包含下列方法,从而为开发人员提供了对普通工作台的生命周期的访问:<o:p></o:p>

  • initialize —— 应该在显示任何窗口之前首先调用该方法。 <o:p></o:p>
  • preStartup —— 其次执行的就是这个方法,但它的调用是在第一个窗口打开之前。在启动或者恢复期间暂时禁用某些项时,该方法非常有用。 <o:p></o:p>
  • postStartup —— 对该方法的调用是执行的第三个操作,它的调用是在第一个窗口打开之后,可以用该方法重新启用 preStartup 方法中临时禁用的项。 <o:p></o:p>
  • postRestore —— 该方法的调用是在已经根据以前保存的状态重新创建工作台及其窗口之后。 <o:p></o:p>
  • preShutdown ——该方法的调用是在事件循环已经终止,任何窗口尚未关闭之前。 <o:p></o:p>
  • postShutdown ——这是最后一个方法,它在事件循环终止之后被调用。 <o:p></o:p>

WorkbenchAdvisor 类包含下列方法,以便为开发人员提供对工作台窗口生命周期的访问: <o:p></o:p>

  • preWindowOpen —— 在打开每个窗口时调用该方法。 <o:p></o:p>
  • fillActionBars —— 在调用 preWindowOpen 方法之后调用该方法,可以使用它配置窗口的动作栏。 <o:p></o:p>
  • postWindowRestore —— 在根据以前保存的状态重新创建窗口之后调用该方法。 <o:p></o:p>
  • postWindowOpen —— 在已经打开一个窗口之后调用该方法。可以使用该方法注册任何窗口监听器。 <o:p></o:p>
  • preWindowShellClose —— 在用户关闭窗口外壳时调用该方法。 <o:p></o:p>

WorkbenchAdvisor 类包含下列方法,以便为开发人员提供对工作台事件循环的访问。<o:p></o:p>

  • eventLoopException —— 可以调用该方法处理事件循环崩溃的异常。 <o:p></o:p>
  • eventLoopIdle —— 在没有更多的事件需要处理的时候调用该方法。<o:p></o:p>

<!----> <!----><o:p></o:p>

WorkbenchAdvisor 是个非常重要的类,它负责配置整个工作台,一个Rcp程序只能存在一个WorkbenchAdvisor(工作台)实例,但可以存在多个WorkbenchWindowAdvisor实例(工作窗口,相当于打开新窗口)。<o:p></o:p>

现象来详细看下WorkbenchWindowAdvisorWorkbenchAdvisor是通过创建WorkbenchWindowAdvisor来实现工作台的配置的,当然也可以不这么做。它也可以自己创建。但我觉得通过WorkbenchWindowAdvisor创建更灵活而且给人感觉更舒服。<o:p></o:p>

ActionBarAdvisor 这个类是我们用来定制菜单,工具条等。它的方法解释如下<o:p></o:p>

protected void makeActions(final IWorkbenchWindow window) {<o:p></o:p>

 //在这里可以通过窗口来定制action,比如文件中的打开,关闭,推出等action。<o:p></o:p>

}<o:p></o:p>

protected void fillMenuBar(IMenuManager menuBar) {<o:p></o:p>

  //定制菜单 <o:p></o:p>

}<o:p></o:p>

<!----> <!----><o:p></o:p>

Application Rcp核心类,根据API说明,此类是RCP启动的Main类,里面的run方法相当于普通java程序的main方法。通常这个类是建立RCP应用程序生成,代码结构基本不用去修改。<o:p></o:p>

java 代码
 
  1. Display display = PlatformUI.createDisplay();  
  2.         try {  
  3.             int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());  
  4.             if (returnCode == PlatformUI.RETURN_RESTART) {  
  5.                 return IPlatformRunnable.EXIT_RESTART;  
  6.             }  
  7.             return IPlatformRunnable.EXIT_OK;  
  8.         } finally {  
  9.             display.dispose();  
  10.         }  

我们可以很清楚的知道,线程会在PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());这里不挺的运行,直到程序崩溃或者用户退出才会返回。<o:p></o:p>

<!----> <!----><o:p></o:p>

恩。我想我基本上知道rcp是怎么运行的了,我对主管说?<o:p></o:p>

那好啊。你总结下,它是怎么运行的。<o:p></o:p>

首先通过plugin.xml文件配置rcp的各个方面,比如扩展点,需求包等。这个文件就好像spring的bean配置文件,告诉了容器上下文。<o:p></o:p>

“我说的对不对啊,主管。”我跟主管说。<o:p></o:p>

“那MANIFEST.MF这个文件的用途是什么呢?”主管说。<o:p></o:p>

我查查啊。噢,原来是跟OSGI有关的啊,在xx版本的esplise以前,plugin.xml做了全部工作,后来改进了。把一些工作放到MANIFEST.MF这个文件来了。我想它主要对OSGI框架运行的元数据包装吧,比如定义RCP的运行环境跟依赖项目(有可能是插件)。<o:p></o:p>

<!----> <!----><o:p></o:p>

对了我们基本上算是了解了RCP的一些基本只是,我现在想了解下,我点击那些菜单的时候为什么会有反映的,它是怎么做到的?<o:p></o:p>

那么我们试验下吧。经过查找API我们发现了Iaction,字面上怎么跟webwork的action差不多啊。因为根据名称我们知道action具体是做什么的。它也是一个Command模式的经典应用吗?<o:p></o:p>

我想是的。看看它的方法<o:p></o:p>

java 代码
 
  1. public void run() {  
  2.         MessageDialog.openInformation(window.getShell(), "Open""Open Message Dialog!");  
  3.     }  
  4. }  

这就更清楚了。我们只要继承Action并覆盖它的run方法就可以实现点击的动作了。哈哈。Eclispe我太喜欢你了,<o:p></o:p>

好我们自己来定义实现一个Action吧。<o:p></o:p>


java 代码
 
  1. public class MessagePopupAction extends Action {  
  2.   
  3.     private final IWorkbenchWindow window;  
  4.   
  5.     MessagePopupAction(String text, IWorkbenchWindow window) {  
  6.         super(text);  
  7.         this.window = window;  
  8.         // The id is used to refer to the action in a menu or toolbar  
  9.         setId(ICommandIds.CMD_OPEN_MESSAGE);  
  10.         // Associate the action with a pre-defined command, to allow key bindings.  
  11.         setActionDefinitionId(ICommandIds.CMD_OPEN_MESSAGE);  
  12.         setImageDescriptor(org.wuhua.rcp.Activator.getImageDescriptor("/icons/sample3.gif"));  
  13.     }  
  14.   
  15.     public void run() {  
  16.         MessageDialog.openInformation(window.getShell(), "Open""Open Message Dialog!");  
  17.     }  
  18. }  

 

上面只是我对rcp一点认识,如果要想设计好rcp我觉得除了对这些基本知识要有了解外,对swt/jface也是要有充分的认识的。<o:p></o:p>

  • 大小: 53.3 KB
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics