Eclipse RCP应用系统开发方法与实战1-- RCP基本框架 下载本文

Eclipse RCP应用系统开发方法与实战1-- RCP基本框架(自己觉得有用作为参考) 收藏 [转]Eclipse RCP应用系统开发方法与实战1-- RCP基本框架

--------------------------------------------------------------------------------

5.1.3 RCP基本框架

一个基本的RCP应用程序已经搭建起来,尽管还非常稚嫩,却已经初具雏形。探究一下RCP的基本框架对于理解RCP大有好处。从前面图5-6可以看出,Eclipse已经自动生成了Application.java、ApplicationActionBarAdvisor.java、 ApplicationWorkbenchAdvisor.java、ApplicationWorkbench- WindowAdvisor.java、Perspective.java这5个类文件。有必要对这5个文件进行分析,以便更深刻地理解RCP的基本框架。在分析之前,先来简单理解一下几个基本概念。 1.基本概念

(1)Display

应用程序一般只需要一个Display对象,该对象实际上是一个SWT对象,代表了底层图形系统的实现。Display的主要任务是事件处理,它负责从操作系统的事件队列中读取事件,传递给RCP的事件监听器以便完成具体的任务。需要注意的是,Display对象不代表应用程序窗口的任何可视控件,在应用程序主窗口打开之前,Display是不可获得的。应用程序主窗口打开之后,才可以通过一个被称作Shell的对象获得。Display对象的获得方法如下。 Display display = new Display();

或者:Display display=Display.getCurrent();

(2)Shell

每一个窗口都有一个Shell对象。Shell对象代表了与用户交互的窗口框架,并处理与窗口关联的诸如移动、改变大小等常见行为。Shell对象的获得方法: Display display=Display.getCurrent(); Shell shell = new Shell(display);

或者:Shell shell=Display.getCurrent().getActiveShell(); (3)Workbench

Workbench是工作台,通俗地说就是代表用户界面的UI元素。工作台上有各种窗口、图标、按钮和控件,用户可以在工作台上做各种操作。获得工作台对象的方法: IWorkbench wb=PlatformUI.getWorkbench(); 工作台对象有两个方法也许很有用:

l wb.restart(),关闭应用程序并立即重新启动。

l wb.close(),正常关闭应用程序,等同于ActionFactory.QUIT_ACTION。

(4)Advisor

Advisor是建议者,用户主界面宽度、高度、图标、菜单、工具栏、颜色、操作等等配置方案需要Advisor来提出“建议”。Eclipse提供了3种类型的Advisor: l WorkbenchAdvisor。应用程序级别,Eclipse3.0开始引入的全新类。每一个应用程序只有一个 Workbench,WorkbenchAdvisor负责该工作台生命周期的管理,例如启动、关闭工作。WorkbenchAdvisor也负责该 Workbench的异常处理,并负责向Workbench提供一些重要参数,例如可以指定该Workbench的初始透视图。

l WorkbenchWindowAdvisor。窗口级别。每一个窗口都有一个WorkbenchWindow- Advisor 实例。WorkbenchWindowAdvisor 负责具体窗口生命周期的管理,例如状态栏、工具栏、菜单、窗口标题、窗口大小和各种控件等等,也可以处理窗口的各种事件例程。

l ActionBarAdvisor。窗口级别。每一个窗口都有一个ActionBarAdvisor实例。ActionBarAdvisor负责管理窗口的菜单栏、状态栏、工具栏的外观和行为。 (5)View和Editor

在Eclipse RCP应用程序中,用户主要通过视图(View)和编辑器(Editor)来与程序交互。视图是可以浮动的工作窗口,负责显示数据在某个层面的状态信息。编辑器也是一种工作窗口,提供对数据进行各种操作的交互能力。

至于是使用视图还是使用编辑器,没有很严格的区分,取决于开发者和用户需求的考虑,例如,应用程序的界面可以毫无障碍地全部使用视图来实现。经费测算系统只有公共参数设置功能模块使用编辑器实现,其他大部分界面均采用视图来实现。

视图扩展自ViewPart抽象类。开发者通常需要在createPartControl()方法中编写代码,以便构建视图的界面元素。下面是一个没有任何处理代码的简单视图。 package cn.edu.jfcs.ui;

import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.part.ViewPart;

public class TeachUnitName extends ViewPart { public TeachUnitName() {

// TODO Auto-generated constructor stub }

public void createPartControl(Composite parent) { // TODO Auto-generated method stub }

public void setFocus() {

// TODO Auto-generated method stub }

}

(6)Perspective

Perspective与视图、编辑器之间的关系类似于书包和书、笔的关系。书包里面可以放各种书和笔,书包是Perspective,而书和笔则类似于视图和编辑器。Perspective被称之为透视图,RCP应用程序是通过透视图对窗口内容进行安排和布局的,应用程序都有一个默认的透视图,每个工作台窗口则可以包含一个或多个透视图,同时用户可向透视图中添加其他UI界面元素。默认透视图被设置为固定的,不能移动,而且没有标题栏。例如运行经费测算系统后,单击【Help】→【Welcome】,将在默认透视图中打开Welcome欢迎界面。关闭该欢迎界面,就会显示一个没有标题栏、只有最小化最大化按钮的空界面,该界面即为默认的透视图。 透视图需要实现IPerspectiveFactory接口。IPerspectiveFactory可以说是产生初始页面布局和可视性透视图的工厂。在Eclipse中,工作台打开的任何新页面都需要一个透视图定义其初始布局。具体说来,就是需要向透视图工厂传递一个IPageLayout对象,通过该对象安排视图或者编辑器的初始布局。默认情况下,初始布局包含了一个可视的编辑区。当然,该编辑区也可以关闭。 2.类文件分析

(1)Application.java

对于普通Java应用程序来说,总是有一个main()方法,应用程序总是从main()开始运行。Application类似于Java应用程序的main(),即RCP应用程序运行开始于Application,Application是RCP应用程序的入口。Application实现了 IPlatformRunnable接口,在RCP启动的时候将会执行该接口的run()方法。从plugin.xml可以获知,Application 实际上是Eclipse org.eclipse.core.runtime.applications运行时扩展点的一个入口。Application主要代码如下: cn.edu.jfcs.app/Application.java import …

public class Application implements IPlatformRunnable { public Object run(Object args) throws Exception { Display display = PlatformUI.createDisplay(); try {

int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor()); if (returnCode == PlatformUI.RETURN_RESTART) { return IPlatformRunnable.EXIT_RESTART; }

return IPlatformRunnable.EXIT_OK; } finally {

display.dispose(); } } }

可以把Application当作RCP应用程序的控制者,它负责应用程序的启动、停止。Application首先创建一个Display对象,然后调用PlatformUI.createAndRunWorkbench()方法启动工作台,这将打开应用程序主窗口,并处于持续打开状态。应用程序开始处理用户的鼠标单击、鼠标移动、按键等各种事件,一直到用户关闭程序退出,这就是所谓的事件循环。当然,在关闭之前,必须销毁Display对象以释放资源(display.dispose())。

从上面的分析可以得到这样一个信息:应用程序主窗口只有在语句“int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());”调用之后才会打开并可视化。开发人员可以利用这一点做做文章,例如在其前面加入启动登录窗口、启动Derby数据库服务器、初始化处理等等工作,代码类似于下面的形式。 ??

//启动Derby数据库服务器

//打开登录界面

int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor()); if (returnCode == PlatformUI.RETURN_RESTART) { return IPlatformRunnable.EXIT_RESTART; }

??

第6章中的实现用户登录处理,就是基于这种处理思路。注意到PlatformUI.createAndRun- Workbench()方法中,除了display对象,还向其传递了另外一个对象:new Application- WorkbenchAdvisor(),那么ApplicationWorkbenchAdvisor又是做什么的? (2)ApplicationWorkbenchAdvisor.java

ApplicationWorkbenchAdvisor类负责应用程序生命周期管理,继承自WorkbenchAdvisor类。开发人员可以在该类中实现程序启动或者关闭时的某种处理。该类的具体实现只是给用户一个初始的视图界面而已,还需要配合WorkbenchWindowAdvisor、ActionBarAdvisor才能构成一个较为完整的用户界面。 ApplicationWorkbenchAdvisor类主要有5个重要的方法,按照执行的先后顺序排列如表5-1所示。 表5-1 ApplicationWorkbenchAdvisor主要方法 方 法 名 方 法 说 明

initialize 最先调用。在窗口打开之前调用,可以用来处理初始化配置工作

preStartup initialize之后、第一个窗口打开之前调用,可以用来处理临时或者可选处理工作

postStartup 第一个窗口打开之后但启动事件循环之前调用,可以用来进行那些需要自动处理的工作,例如弹出一个提示窗口

preShutdown 事件循环结束之后但窗口关闭之前调用,可以用来进行保存数据、关闭数据库服务器等处理工作 postShutdown 窗口关闭之后调用,可以用来进行保存应用程序状态、清除initialize创建的对象等处理工作

ApplicationWorkbenchAdvisor.java主要代码如下。 cn.edu.jfcs.app/ ApplicationWorkbenchAdvisor.java import …

public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor { private static final String PERSPECTIVE_ID = \ public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor( IWorkbenchWindowConfigurer configurer) {