EclipseRCP应用系统开发方法与实战.docx_第1页
EclipseRCP应用系统开发方法与实战.docx_第2页
EclipseRCP应用系统开发方法与实战.docx_第3页
EclipseRCP应用系统开发方法与实战.docx_第4页
EclipseRCP应用系统开发方法与实战.docx_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Eclipse RCP应用系统开发方法与实战1- RCP基本框架 2008-12-30 13:32:46标签:推送到技术圈 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)WorkbenchWorkbench是工作台,通俗地说就是代表用户界面的UI元素。工作台上有各种窗口、图标、按钮和控件,用户可以在工作台上做各种操作。获得工作台对象的方法:IWorkbench wb=PlatformUI.getWorkbench();工作台对象有两个方法也许很有用:l wb.restart(),关闭应用程序并立即重新启动。l wb.close(),正常关闭应用程序,等同于ActionFactory.QUIT_ACTION。(4)AdvisorAdvisor是建议者,用户主界面宽度、高度、图标、菜单、工具栏、颜色、操作等等配置方案需要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 .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)PerspectivePerspective与视图、编辑器之间的关系类似于书包和书、笔的关系。书包里面可以放各种书和笔,书包是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主要代码如下:.jfcs.app/Application.javaimport 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.javaApplicationWorkbenchAdvisor类负责应用程序生命周期管理,继承自WorkbenchAdvisor类。开发人员可以在该类中实现程序启动或者关闭时的某种处理。该类的具体实现只是给用户一个初始的视图界面而已,还需要配合WorkbenchWindowAdvisor、ActionBarAdvisor才能构成一个较为完整的用户界面。 ApplicationWorkbenchAdvisor类主要有5个重要的方法,按照执行的先后顺序排列如表5-1所示。表5-1 ApplicationWorkbenchAdvisor主要方法方 法 名方 法 说 明initialize最先调用。在窗口打开之前调用,可以用来处理初始化配置工作preStartupinitialize之后、第一个窗口打开之前调用,可以用来处理临时或者可选处理工作postStartup第一个窗口打开之后但启动事件循环之前调用,可以用来进行那些需要自动处理的工作,例如弹出一个提示窗口preShutdown事件循环结束之后但窗口关闭之前调用,可以用来进行保存数据、关闭数据库服务器等处理工作postShutdown窗口关闭之后调用,可以用来进行保存应用程序状态、清除initialize创建的对象等处理工作ApplicationWorkbenchAdvisor.java主要代码如下。.jfcs.app/ ApplicationWorkbenchAdvisor.javaimport public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor private static final String PERSPECTIVE_ID = .jfcs.perspective; public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor( IWorkbenchWindowConfigurer configurer) return new ApplicationWorkbenchWindowAdvisor(configurer); public void initialize(IWorkbenchConfigurer configurer) super.initialize(configurer); configurer.setSaveAndRestore(true); public String getInitialWindowPerspectiveId() return PERSPECTIVE_ID; 上述程序主要做了两件事情:一是初始化需要在主界面显示的透视图(Perspective),创建并返回ApplicationWorkbenchWindowAdvisor对象。二是初始化方法中代码 configurer.setSaveAndRestore(true)用于设置应用程序每次退出时保存当前窗口状态,并在下次启动时应用,这对应用程序性能稍有影响,建议修改为false不保存。getInitialWindowPerspectiveId()方法打开默认的透视图 .jfcs.perspective。如果在初始化initialize事件中编写大量处理代码,会引起应用程序启动时主窗口的延迟显示,给用户以系统速度较慢的感觉。因此,应该尽量避免。(3)ApplicationWorkbenchWindowAdvisor.javaApplicationWorkbenchWindowAdvisor类负责应用程序窗口生命周期的管理,该类扩展自WorkbenchWindowAdvisor。每一个应用程序都需要一个WorkbenchWindowAdvisor来控制窗口界面的UI元素。开发人员可以控制窗口创建时的大小、标题、位置等等,也可以添加创建、打开、还原或关闭工作台窗口时调用的方法。 ApplicationWorkbenchWindowAdvisor主要方法如表5-2所示。表5-2 ApplicationWorkbenchWindowAdvisor主要方法方 法 名方 法 说 明preWindowOpen窗口控件创建之前调用,可以在该方法中设置窗口的初始大小、状态栏、工具栏等的可视性postWindowRestore当窗口根据上一次的保存状态恢复创建之后调用,可以用来调整调整窗口恢复状态postWindowCreate窗口创建之后调用,可以用于调整窗口postWindowOpen窗口已经打开之后调用,可以用来注册窗口监听,例如在此方法中实现系统托盘下面我们来看看Eclipse自动生成的ApplicationWorkbenchWindowAdvisor.java主要代码如下:.jfcs.app/ ApplicationWorkbenchWindowAdvisor.javaimport public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) super(configurer); public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) return new ApplicationActionBarAdvisor(configurer); public void preWindowOpen() IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); configurer.setInitialSize(new Point(700, 550); /定义窗口初始化大小 configurer.setShowCoolBar(false); /不显示工具栏 configurer.setShowStatusLine(false); /不显示状态栏 configurer.setTitle(jfcs); /窗口标题为jfcs 该类创建了一个ApplicationActionBarAdvisor对象,并通过preWindowOpen()方法方法配置窗口。在 preWindowOpen()方法中,首先生成了configurer对象,通过该对象配置窗口的大小、工具栏、状态栏、标题等可视化元素,也就是说控制窗口的外观。默认状态下工具栏和状态栏都是隐藏的。IWorkbenchWindowConfigurer是一个接口类,该接口类提供了很多 set/get方法以便用户访问存取工作台窗口的配置。实际上,大家可能也注意到了,每种类型的Advisor都有一个对应的configurer。 ApplicationWorkbenchAdvisor中的IWorkbenchConfigurer、 ApplicationWorkbenchWindowAdvisor中的IWorkbenchWindowConfigurer、后面 Application- ActionBarAdvisor中的IActionBarConfigurer,configurer是与工作台、窗口、菜单、工具栏和状态栏打交道的一座方便的桥梁。(4)ApplicationActionBarAdvisor.javaApplicationActionBarAdvisor.java类负责定义窗口的行为,该类扩展自ActionBarAdvisor。具体地说,该类用于构建菜单栏、工具栏和状态行。ActionBarAdvisor自然是负责菜单栏、工具栏和状态行的创建和注册。 ApplicationActionBarAdvisor主要方法如表5-3所示。表5-3 ApplicationActionBarAdvisor主要方法方 法 名方 法 说 明void makeActions(IWorkbenchWindow window)注册菜单或者工具栏的动作void fillMenuBar(IMenuManager menuBar)添加菜单栏void fillCoolBar(ICoolBarManager coolBar)添加工具栏void fillStatusLine(IStatusLineManager statusLine)添加状态栏ApplicationActionBarAdvisor.java主要代码如下。.jfcs.app/ ApplicationActionBarAdvisor.javaimport public class ApplicationActionBarAdvisor extends ActionBarAdvisor private IWorkbenchAction introAction; public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) super(configurer); protected void makeActions(IWorkbenchWindow window) /利用ActionFactory动作工厂创建introAction introAction = ActionFactory.INTRO.create(window); register(introAction); protected void fillMenuBar(IMenuManager menuBar) MenuManager helpMenu = new MenuManager(&Help, IWorkbenchActionConstants.M_HELP); menuBar.add(helpMenu); helpMenu.add(introAction); 该程序创建了一个帮助菜单栏,其子菜单所执行的动作采用Eclipse内置的ActionFactory.INTRO,执行该动作将显示Welcome欢迎画面。(5)Perspective.javaPerspective类主要负责界面布局的安排。Perspective.java代码如下。.jfcs.app/ Perspective.javaimport public class Perspective implements IPerspectiveFactory public void createInitialLayout(IPageLayout layout) String editorArea = layout.getEditorArea(); /获得布局的编辑区 layout.setEditorAreaVisible(false); /隐藏编辑区 layout.setFixed(true); /固定布局 / 此处加入各种视图 createInitialLayout()方法通常用于创建初始的界面布局,当前是空实现,所以打开经费测算系统并关闭欢迎画面后,界面会出现空白,后面将加入主界面视图。5.1.4 定制应用程序窗口属性向导生成的应用程序主界面并不能满足要求,存在很多问题,例如,主界面运行时没有自动居中,主界面大小没有固定,主窗口标题栏文字应该是“高校经费测算系统”。再看看图5-3、图5-4的标题栏有区别没有?当然有,图5-3所示界面的标题栏是很漂亮的弧线形,而图5-4所示界面的标题栏则不是。如此等等,需要重新设置。1闪屏画面应用程序主界面显示之前往往需要做一些初始化处理工作,就是启动时间可能稍微长一些,如果没有任何提示,用户可能会感到困惑,闪屏画面能够较好地解决这个问题。准备一幅24bit色BMP格式的图片,注意图片大小不要超过500mm300mm。将该图片复制到项目文件夹中替换掉原来的splash.bmp文件即可。2不保存窗口状态将ApplicationWorkbenchAdvisor.java的initialize()方法中的语句:configurer.setSaveAndRestore(true);修改为:configurer.setSaveAndRestore(false);前文说过,设置为true,应用程序每次退出时将保存窗口状态,此处并不需要且对性能有轻微影响,所以设置为false。3定制窗口式样再来定制主窗口。前面已经介绍过,在ApplicationWorkbenchWindowAdvisor.java的preWindowOpen()方法中定制窗口式样,现在修改如下。.jfcs.app/ ApplicationWorkbenchWindowAdvisor.java public void preWindowOpen() IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); /窗口设定为800x600 configurer.setInitialSize(new Point(800, 600); /暂时不显示工具栏 configurer.setShowCoolBar(false); /显示状态栏 configurer.setShowStatusLine(true); /窗口只显示最小化、关闭按钮 configurer.setShellStyle(SWT.MIN | SWT.CLOSE); /设置窗口标题 configurer.setTitle(高校经费测算系统); 执行上步操作后,我们会发现configurer.setShellStyle(SWT.MIN | SWT.CLOSE)这句代码的旁边出现一个带红色叉叉的小灯泡,这意味着该行代码有问题,这是因为使用了SWT.MIN常量而又没有导入相应类。解决方法很简单,只需鼠标单击小灯泡,根据弹出的提示导入包import org.eclipse.swt.SWT即可,这也是Eclipse很贴心的小功能。现在运行看看,程序主界面已经有了较大变化。程序中最后一句代码中的“高校经费测算系统”是一个自定义常量。一个系统中有很多类似的自定义常量,例如图片的名称、视图的名称等等,而这些常量可能不止一个地方需要使用到。一个很好的方法是创建一个接口文件,将全部常量的定义放置到该接口文件中,这样可以统一管理,而且维护方便。如果要修改某个常量的值,只需要到接口文件中修改就可以了。下面来实现该处理,新建一个包.jfcs.sys,在该包下新建接口类 IAppConstants.java,代码类似于以下形式。package .jfcs.sys;public interface IAppConstants public static final String APPLICATION_TITLE=高校经费测算系统;现在只需要将 ApplicationWorkbenchWindowAdvisor.java中preWindowOpen()方法的 configurer.setTitle(高校经费测算系统)修改为 configurer.setTitle(IAppConstants.APPLICATION_ TITLE)即可。记得导入.jfcs.sys.IAppConstants类。以后还会不断往该接口文件中添加常量定义。为了避免不必要的麻烦,建议读者在实际操作时先将本书附带源代码的IAppConstants.java类直接复制到自己的项目中。4窗口自动居中窗口居中需要手工编程实现,编写之前先得想想代码放在哪儿?还是放在preWindowOpen()方法中吗?当然不行,preWindowOpen()是配置窗口的构成元素,即形成窗口本身的构成部件,而居中则是定义窗口的位置,显然不属于窗口构成元素。 postWindowOpen()可以胜任此项工作,因为postWindowOpen()主要用来处理那些需要一个现成窗口才能进行的事件处理。在代码编辑视图中单击鼠标右键,在弹出的快捷菜单中选择【Source】【Override/ Implement Methods】命令,弹出“Override/Implement Methods”对话框,勾选postWindowOpen()方法,默认将在光标所在处插入postWindowOpen()方法。这又是 Eclipse的一个很贴心的功能,希望读者熟练使用。改写该方法的代码如下:.jfcs.app/ ApplicationWorkbenchWindowAdvisor.java public void postWindowOpen() /设置窗口自动居中 Shell shell = getWindowConfigurer().getWindow().getShell(); Rectangle screenSize = Display.getDefault().getClientArea(); Rectangle frameSize = shell.getBounds(); shell.setLocation(screenSize.width - frameSize.width) / 2,( screenSize.height - frameSize.height) / 2); 该方法通过默认Display对象来设置屏幕宽度和高度,通过Shell对象获得当前窗口的宽度和高度,两者分别相减后再除以2,计算得到窗口左上角的(x,y)坐标。不要忘了导入相关的类,再看看运行后窗口是否自动居中。5设置视图标题栏的弧线形外观大家肯定都喜欢图5-3所示界面中弧线形的标题栏,这种风格的标题栏涉及到工作台UI属性(org.eclipse.ui Preference):SHOW_TRADITIONAL_STYLE_TABS。可以通过三种方法进行设置。(1)硬编码实现硬编码实现是指通过直接编写代码实现。打开ApplicationWorkbenchAdvisor.java文件,修改initialize()方法代码如下:.jfcs.app/ ApplicationWorkbenchAdvisor.javapublic void initialize(IWorkbenchConfigurer configurer) super.initialize(configurer); configurer.setSaveAndRestore(false);PlatformUI.getPreferenceStore().setValue(IWorkbenchPreferenceConstants. SHOW_TRADITIONAL_STYLE_TABS, false);相关的属性很多,具体可以查看IWorkbenchPreferenceConstants接口文件。方法是,按住【Ctrl】键,将鼠标移动到IWorkbenchPreferenceConstants上面,IWorkbenchPreferenceConstants下面会出现下划线,单击鼠标左键即可。对于Eclipse的其他方法也是如此操作。这里先简单介绍几个常用属性。表5-4 IWorkbenchPreferenceConstants常见属性属 性 名属 性 说 明EDITOR_MINIMUM_CHARACTERS但很多编辑器重叠时,设置编辑器标题文字的最短长度。默认为8个字符SHOW_PROGRESS_ON_STARTUP设置启动时是否显示进度条。默认值falseDOCK_PERSPECTIVE_BAR设置透视图标题栏停泊位置。默认值为TOP_RIGHT,还可以设置为TOP_LEFT、LEFTSHOW_TEXT_ON_PERSPECTIVE_BAR设置透视图是否显示标题文本。默认值为trueSHOW_INTRO启动时是否显示欢迎画面。默认值为true可能有些人喜欢每次启动时显示欢迎画面,则可以在initialize()方法中加入:PlatformUI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论