通过PDE的向导,用户能很容易地创建RCP?的应用,但如果要在此基础上继续扩展,则要了解RCP的组成及各部分的功能。 import org.eclipse.core.runtime.IPlatformRunnable; public class Application implements IPlatformRunnable { ?public Object run(Object args) throws Exception { import org.eclipse.ui.application.IWorkbenchWindowConfigurer; public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor { ?//创建工作台窗口? ??? //获得当前工作台的视角? 表?1?工作台生命周期相关方法 方 法 描 述 参 数 initialize 工作台初始化 IWorkbenchConfigurer preStartup 在?initialize?之后,工作台窗口被打开之前执行 无 postStartup 在所有的工作台窗口被打开之后执行 无 preShutdown 工作台被停止之前(窗口被关闭之前)执行 无 postShutdown 工作台被停止之后(窗口被关闭之后)执行 无 消息循环负责处理用户的输入,然后把输入分配到相关的监听器进行处理,WorkbenchAdvisor?中提供了一些钩子方法,处理消息循环的某些问题,如表2?所示。 表?2?消息循环相关方法 方 法 描 述 参 数 eventLoopException 当消息循环中有未处理的异常时执行 Throwable eventLoopIdle 当消息队列中无处理的消息时执行 Display (3)配置相关方法? 工作台窗口ApplicationWorkbenchWindowAdvisor? 例程3 ApplicationWorkbenchWindowAdvisor.java package com.free.rcp.mail; import org.eclipse.ui.application.ActionBarAdvisor; import org.eclipse.ui.application.IActionBarConfigurer; import org.eclipse.ui.application.IWorkbenchWindowConfigurer; import org.eclipse.ui.application.WorkbenchWindowAdvisor; ? super(configurer); } public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) { return new ApplicationActionBarAdvisor(configurer); } IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); //设置工作台窗口的大小 configurer.setInitialSize(new Point(600, 400)); //是否显示CoolBar configurer.setShowCoolBar(true); //是否显示状态栏 configurer.setShowStatusLine(false); } } 用 户也可以通过重写WorkbenchWindowAdvisor中的方法,控制工作台窗口生命周期的执行过程。例如,上例的preWindowOpen方 法,在窗口打开直接设置窗口的大小、是否显示状态栏等属性,这些方法大多数以“pre”、“post”和“create”开始。 工作台“Action Bar”ApplicationActionBarAdvisor 在Eclipse?中,“Action?Bar?”是菜单、工具栏和状态栏的统称,通过ActionBarAdvisor?可以定制RCP?应用的“Action?Bar?”,代码如例程4?所示。 例程4? ApplicationActionBarAdvisor.java /**? ??? private IWorkbenchAction exitAction;? ??? public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {? import org.eclipse.ui.IFolderLayout; public class Perspective implements IPerspectiveFactory { ?public void createInitialLayout(IPageLayout layout) {
Plugin.xml描述?
RCP程序是基于插件架构的,所以开发RCP程序首先是开发Eclipse?插件,把用户开发的插件集成到Eclipse的内核中,共同组成RCP应用,RCP程序也是通过Plugin.xml文件描述插件的。在上一节的mail示例中,Plugin.xml文件描述了实现扩展点的几个部分,介绍如下。
(1)视图:mail应用定义了两个视图,一个为Message视图,另一个为Mailboxes视图,如以下代码所示。?
?? <extension
???????? point="org.eclipse.ui.views">
????? <view?
??????????? name="Message"?
??????????? allowMultiple="true"?
??????????? icon="icons/sample2.gif"?
??????????? class="com.free.rcp.mail.View"?
??????????? id="com.free.rcp.mail.view">
????? </view>
????? <view
??????????? name="Mailboxes"
??????????? allowMultiple="true"?
??????????? icon="icons/sample3.gif"
??????????? class="com.free.rcp.mail.NavigationView"?
??????????? id="com.free.rcp.mail.navigationView">?
????? </view>?
?? </extension>?
(2)默认透视图:在mail应用中,透视图只包含了应用中定义的视图,其定义如以下代码所示。
?? <extension?
???????? point="org.eclipse.ui.perspectives">
????? <perspective?
??????????? name="Mail Perspective"
??????????? class="com.free.rcp.mail.Perspective"?
??????????? id="com.free.rcp.mail.perspective">?
????? </perspective>?
?? </extension>
(3)应用:RCP应用中都要实现自己的应用,如以下代码所示。?
?? <extension
???????? id="application"
???????? point="org.eclipse.core.runtime.applications">
????? <application>?
???????? <run
?????????????? class="com.free.rcp.mail.Application">
???????? </run>
????? </application>
?? </extension>?
(4)产品:可以通过产品来发布用户定义的应用,如以下代码所示。
?<extension
???????? id="product"?
???????? point="org.eclipse.core.runtime.products">?
????? <product
??????????? application="com.free.rcp.mail.application"
??????????? name="RCP Product">
???????? <property
?????????????? name="aboutText"?
?????????????? value="%aboutText">?
???????? </property>
???????? <property?
?????????????? name="windowImages"
?????????????? value="icons/sample2.gif">
???????? </property>
???????? <property
?????????????? name="aboutImage"?
?????????????? value="product_lg.gif">
???????? </property>
????? </product>?
? </extension>?
mail示例是一个比较完整的RCP应用,用户可以看到,mail实现了自己的视图、视角和产品的扩展点,组织应用的布局和相关的实现。下面将介绍RCP应用中所实现的功能。?
RCP应用的入口Application?
Eclipse 的运行时组件通过“org.eclipse.core.runtime.applications”扩展点找到RCP应用的入口,执行应用。应用扩展点要 实现IPlatformRunnable接口,Eclipse会执行应用实现类的run方法,代码如例程1所示。
例程1? Application.java
package com.free.rcp.mail;
import org.eclipse.swt.widgets.Display;?
import org.eclipse.ui.PlatformUI;
??//得到display?
??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类实现了IPlatformRunnable接口,Eclipse内核会执行run方法运行应用。在run方法中,通过PlatformUI类的createAndRunWorkbench方法创建了应用的工作台。
工作台ApplicationWorkbenchAdvisor?
Application通过PlatformUI的createAndRunWorkbench创建应用的工作台,其中第二个参数为WorkbenchAdvisor,表示工作台的配置等。例如可以获得应用的视角,代码如例程2所示。
例程2? ApplicationWorkbenchAdvisor.java?
package com.free.rcp.mail;
import org.eclipse.ui.application.WorkbenchAdvisor;?
import org.eclipse.ui.application.WorkbenchWindowAdvisor;
?
?//视角ID
?private static final String PERSPECTIVE_ID = "com.free.rcp.mail.perspective";
??? public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(?
??? ??IWorkbenchWindowConfigurer configurer) {
??????? return new ApplicationWorkbenchWindowAdvisor(configurer);?
??? }
?public String getInitialWindowPerspectiveId() {
??return PERSPECTIVE_ID;
?} ??
}?
如以上代码所示,通过ApplicationWorkbenchAdvisor类的getInitialWindowPerspectiveId可以获得当前工作台的视角,通过createWorkbenchWindowAdvisor方法能创建当前工作台的窗口。?
另外,用户可以通过实现WorkbenchAdvisor类,以及重写WorkbenchAdvisor的方法,控制工作台的生命周期中每个切入点的执行方法,主要有如下的方法。
(1)工作台生命周期相关方法?
WorkbenchAdvisor类有几个方法和工作台的生命周期有关,用户能通过重写这几个方法,在工作台生命周期的某个特定点执行自己的代码,如表1所示。(2?)消息循环相关方法
WorkbenchAdvisor中能通过重写一些方法,实现工作台的配置,其中最常用的是getInitialWindowPerspectiveId方法,返回视角的ID。
ApplicationWorkbenchAdvisor 类通过createWorkbenchWindowAdvisor方法能创建工作台窗口。通过实现WorkbenchWindowAdvisor类,用户 能定制工作台窗口的大小、状态栏、工具栏等信息,代码如例程3所示。
import org.eclipse.swt.graphics.Point;
public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
//创建Action Bar
public void preWindowOpen() {
package com.free.rcp.mail;
?* 为了节省篇幅,所有的import类已经被注释?
?* 读者可以通过ctrl+shift+o快捷键,自动引入所依赖的类?
?* 如果有问题可发邮件到ganshm@gmail.com?
?* */
public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
??? private IWorkbenchAction aboutAction;
??? private IWorkbenchAction newWindowAction;
??? private OpenViewAction openViewAction;?
??? private Action messagePopupAction;
??????? super(configurer);?
??? }
???
??? protected void makeActions(final IWorkbenchWindow window) {
????
??????? //创建相应的Action?
??????? exitAction = ActionFactory.QUIT.create(window);?
??????? register(exitAction);
????????
??????? aboutAction = ActionFactory.ABOUT.create(window);?
??????? register(aboutAction);?
????????
??????? newWindowAction = ActionFactory.OPEN_NEW_WINDOW.create(window);?
??????? register(newWindowAction);?
???????
??????? penViewAction = new OpenViewAction(window, "Open Another Message View", View.ID);?
??????? register(openViewAction);?
???????
??????? messagePopupAction = new MessagePopupAction("Open Message", window);?
??????? register(messagePopupAction);?
??? }
???
??? protected void fillMenuBar(IMenuManager menuBar) {?
??? ?//添加文件和帮助菜单
??????? MenuManager fileMenu = new MenuManager("&File",?
??????? ??IWorkbenchActionConstants.M_FILE);
??????? MenuManager helpMenu = new MenuManager("&Help",?
??????? ??IWorkbenchActionConstants.M_HELP);
????????
??????? menuBar.add(fileMenu);?
??????? // Add a group marker indicating where action set menus will appear.?
??????? menuBar.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
??????? menuBar.add(helpMenu);?
????????
??????? //添加文件菜单的Action?
??????? fileMenu.add(newWindowAction);
??????? fileMenu.add(new Separator());
??????? fileMenu.add(messagePopupAction);
??????? fileMenu.add(openViewAction);
??????? fileMenu.add(new Separator());?
??????? fileMenu.add(exitAction);?
???????
??????? //添加帮助菜单的Action?
??????? helpMenu.add(aboutAction);
??? }
???
??? protected void fillCoolBar(ICoolBarManager coolBar) {
??? ?//添加CoolBar
??????? IToolBarManager toolbar = new ToolBarManager(SWT.FLAT | SWT.RIGHT);
??????? //添加ToolBar到CoolBar中
??????? coolBar.add(new ToolBarContributionItem(toolbar, "main"));???
??????? //添加Action到ToolBar中?
??????? toolbar.add(openViewAction);?
??????? toolbar.add(messagePopupAction);?
??? }
}?
以上程序通过makeActions方法创建了所有的Action,通过fillMenuBar方法添加了文件菜单和帮助菜单,通过fillCoolBar方法添加了CoolBar工具栏项。菜单和工具栏共用相关的Action。?
RCP应用的透视图(perspective)
WorkbenchAdvisor 中getInitialWindowPerspectiveId方法是一个抽象方法,也就是说要通过WorkbenchAdvisor创建工作台,用户必 须实现自己的透视图(也可以是Eclipse中现有的视角)。工作台会通过getInitialWindowPerspectiveId方法得到透视图扩 展点的ID,并用此透视图对视图布局。本例中透视图的实现代码如例程5所示。
例程5? Perspective.java?
package com.free.rcp.mail;
import org.eclipse.ui.IPageLayout;?
import org.eclipse.ui.IPerspectiveFactory;
??String editorArea = layout.getEditorArea();?
??//设置编辑区域不可见
??layout.setEditorAreaVisible(false);?
??
??//添加视图
??layout.addStandaloneView(NavigationView.ID,??
????false, IPageLayout.LEFT, 0.25f, editorArea);?
??//添加Folder,并在Folder中添加视图
??IFolderLayout folder = layout.createFolder("messages",
????IPageLayout.TOP, 0.5f, editorArea);
??folder.addPlaceholder(View.ID + ":*");
??folder.addView(View.ID);
???
??//设置NavigationView视图不可关闭
??layout.getViewLayout(NavigationView.ID).setCloseable(false);?
?}
}
在Perspective视角中设置了编辑区域不可见,并添加了两个视图,其中messages视图放在一个Folder中,在此Folder中还能添加其他的视图,最后通过setCloseable方法设置NavigationView视图是不可关闭的。?
在此,视图和其他扩展点的实现就不介绍了,读者可以参考源代码了解mail应用的实现。
RCP是Eclipse 3.0以后发展起来的,目的在于以Eclipse平台为框架,开发出基于Java?的独立运行的应用。可以断言,随着Eclipse开发的不断深入和广为用户接受,RCP程序将会在Java的桌面应用中占据一席之地。
详细解决方案
Eclipse开发:理解RCP应用的实现
热度:30 发布时间:2016-04-23 02:12:30.0
相关解决方案
- eclipse struts2找不到action!调了一个晚下了
- Eclipse + Tomcat Debug時很慢,该怎么解决
- eclipse+tomcat6.0+oracle 10g配置数据库连接池的异常
- eclipse ee版本 怎么新建和发布 web project
- eclipse 运用URL连接出错,求解
- eclipse jee tomcat警告有关问题
- eclipse 提醒 configure build path
- !hadoop 0.21.0 eclipse 3.7 win7,点击run on hadoop报错
- JDBC MYSQL 驱动加载失败 JSP DAO ECLIPSE,该怎么解决
- Eclipse 报错org.apache.catalina.LifecycleException: Failed to start component。该怎么解决
- eclipse 老崩溃 错误异常如下
- Eclipse JSP调用Servlet的有关问题
- eclipse 怎么发布 Dynamic web project到Tomcat
- eclipse 经典版,最新稳定版是多少?解决方法
- 【文件分享】Eclipse Plug-in资料分享
- eclipse 在线安装 birt,该怎么解决
- 现下公司里开发用的 Eclipse + MyEclipse + Tomcat + JDK 都是什么版本的
- Eclipse plugin/RCP开发资料大整理
- 现时公司里开发用的 Eclipse + MyEclipse + Tomcat + JDK 都是什么版本的
- j2me eclipse antenna打包混合出错了,该怎么处理
- Eclipse + wtk下,如何加com.nokia.mid.ui
- Eclipse 混淆包错误有关问题
- Eclipse 调试 J2ME 出现有关问题了。
- eclipse 3.2中J2ME 开发配置有关问题
- eclipse wtk 2.2整和有关问题
- eclipse 集成 javaAPI 的有关问题
- eclipse class not found 愁死了解决方法
- eclipse 没法打包资源文件
- 急问:S60,eclipse,打开模拟器总是提示“unhandled exception.Close application?该如何解决
- 请教怎么在 Eclipse 中配置M3G 包以 支持 J2ME 的 3D 游戏开发?