通过PDE的向导,用户能很容易地创建RCP的应用,但如果要在此基础上继续扩展,则要了解RCP的组成及各部分的功能。Plugin.xml描述

RCP程序是基于插件架构的,所以开发RCP程序首先是开发Eclipse插件,把用户开发的插件集成到Eclipse的内核中,共同组成RCP应用,RCP程序也是通过Plugin.xml文件描述插件的。在上一节的mail示例中,Plugin.xml文件描述了实现扩展点的几个部分,介绍如下。

(1)视图:mail应用定义了两个视图,一个为Message视图,另一个为Mailboxes视图,如以下代码所示。

point="org.eclipse.ui.views">

name="Message"

allowMultiple="true"

icon="icons/sample2.gif"

class="com.free.rcp.mail.View"

id="com.free.rcp.mail.view">

name="Mailboxes"

allowMultiple="true"

icon="icons/sample3.gif"

class="com.free.rcp.mail.NavigationView"

id="com.free.rcp.mail.navigationView">

(2)默认透视图:在mail应用中,透视图只包含了应用中定义的视图,其定义如以下代码所示。

point="org.eclipse.ui.perspectives">

name="Mail Perspective"

class="com.free.rcp.mail.Perspective"

id="com.free.rcp.mail.perspective">

(3)应用:RCP应用中都要实现自己的应用,如以下代码所示。

id="application"

point="org.eclipse.core.runtime.applications">

class="com.free.rcp.mail.Application">

(4)产品:可以通过产品来发布用户定义的应用,如以下代码所示。

id="product"

point="org.eclipse.core.runtime.products">

application="com.free.rcp.mail.application"

name="RCP Product">

name="aboutText"

value="%aboutText">

name="windowImages"

value="icons/sample2.gif">

name="aboutImage"

value="product_lg.gif">

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.core.runtime.IPlatformRunnable;

import org.eclipse.swt.widgets.Display;

import org.eclipse.ui.PlatformUI;

public class Application implements IPlatformRunnable {

public Object run(Object args) throws Exception {

//得到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.IWorkbenchWindowConfigurer;

import org.eclipse.ui.application.WorkbenchAdvisor;

import org.eclipse.ui.application.WorkbenchWindowAdvisor;

public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {

//视角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所示。

表1工作台生命周期相关方法

方 法

描 述

参 数

initialize

工作台初始化

IWorkbenchConfigurer

preStartup

在initialize之后,工作台窗口被打开之前执行

postStartup

在所有的工作台窗口被打开之后执行

preShutdown

工作台被停止之前(窗口被关闭之前)执行

postShutdown

工作台被停止之后(窗口被关闭之后)执行

(2)消息循环相关方法

消息循环负责处理用户的输入,然后把输入分配到相关的监听器进行处理,WorkbenchAdvisor中提供了一些钩子方法,处理消息循环的某些问题,如表2所示。

表2消息循环相关方法

方 法

描 述

参 数

eventLoopException

当消息循环中有未处理的异常时执行

Throwable

eventLoopIdle

当消息队列中无处理的消息时执行

Display

(3)配置相关方法

WorkbenchAdvisor中能通过重写一些方法,实现工作台的配置,其中最常用的是getInitialWindowPerspectiveId方法,返回视角的ID。

工作台窗口ApplicationWorkbenchWindowAdvisor

ApplicationWorkbenchAdvisor类通过createWorkbenchWindowAdvisor方法能创建工作台窗口。通过实现WorkbenchWindowAdvisor类,用户能定制工作台窗口的大小、状态栏、工具栏等信息,代码如例程3所示。

例程3 ApplicationWorkbenchWindowAdvisor.java

package com.free.rcp.mail;

import org.eclipse.swt.graphics.Point;

import org.eclipse.ui.application.ActionBarAdvisor;

import org.eclipse.ui.application.IActionBarConfigurer;

import org.eclipse.ui.application.IWorkbenchWindowConfigurer;

import org.eclipse.ui.application.WorkbenchWindowAdvisor;

public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {

public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {

super(configurer);

}

//创建Action Bar

public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {

return new ApplicationActionBarAdvisor(configurer);

}

public void preWindowOpen() {

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

package com.free.rcp.mail;

/**

* 为了节省篇幅,所有的import类已经被注释

* 读者可以通过ctrl+shift+o快捷键,自动引入所依赖的类

* 如果有问题可发邮件到ganshm@gmail.com

* */

public class ApplicationActionBarAdvisor extends ActionBarAdvisor {

private IWorkbenchAction exitAction;

private IWorkbenchAction aboutAction;

private IWorkbenchAction newWindowAction;

private OpenViewAction openViewAction;

private Action messagePopupAction;

public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {

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.IFolderLayout;

import org.eclipse.ui.IPageLayout;

import org.eclipse.ui.IPerspectiveFactory;

public class Perspective implements IPerspectiveFactory {

public void createInitialLayout(IPageLayout layout) {

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的桌面应用中占据一席之地。

java rcp 开发 eclipse_Eclipse开发:了解RCP应用的实现相关推荐

  1. Java 8 失宠!开发人员向 Java 11 转移...

    以下文章来源方志朋的博客,回复"666"获面试宝典 作者:白开水 来源:OSC开源社区(ID:oschina2013) 此前的 Java 社区报告曾指出,Java 8 仍是开发人员 ...

  2. 《Java EE企业级应用开发》,《分布式爬虫》等书包邮送50本!企业开发利器!...

    来给大家送一波福利,这次联系了10个好友一起给各位送书,每个号送 5 本,一共 50本,还包邮哦. 感谢传智播客对本次活动的赞助.   金主介绍:传智播客是国内数一数二的IT培训机构,现在关注传智播客 ...

  3. 慕课网_《Java微信公众号开发进阶》学习总结

    时间:2017年08月12日星期六 说明:本文部分内容均来自慕课网.@慕课网:http://www.imooc.com 教学源码:http://img.mukewang.com/down/... 学习 ...

  4. java微信公众号开发token验证失败的问题及解决办法

    java微信公众号开发token验证失败的问题及解决办法 参考文章: (1)java微信公众号开发token验证失败的问题及解决办法 (2)https://www.cnblogs.com/beardu ...

  5. 是否可以将Java 8用于Android开发?

    本文翻译自:Is it possible to use Java 8 for Android development? Searching the web, it is not clear if Ja ...

  6. vue java 插件开发_实习模块vue+java小型全栈开发(三)

    实习模块vue+java小型全栈开发(三) --dx 背景 首先,先给自己一个答案:这篇博客我定义为(三),因为之前的两个模块页面,内容都是一样的,但是被改了几次需求,就一直拖着没有上传. 今天是真正 ...

  7. java ug二次开发_使用Java进行UG二次开发:简单的例子(上) | 学步园

    最近因为要进行TeamCenter二次开发(胖客户端定制),所有要开始研究Java了.因此突发奇想为什么不能使用Java进行二次开发呢?现在对UG进行的开发以C/C++应用为主.大多数使用的是原来的U ...

  8. Java在eclipse下开发的常用快捷键集锦

    2019独角兽企业重金招聘Python工程师标准>>> Java在eclipse下开发的常用快捷键集锦 ctrl+shift+o 说明:删除无用的代码引用 使用场景:当前文件中的引用 ...

  9. java swing图形界面开发 java.swing简介

    最近在看YouTube上面的视频的时候,虽然学着做了一点界面和一点可以运行的东西,但是里面用到的库文件我还是不明就里的.所以我打算在制作游戏之前,先花几天的时间大概地研究一下关于java.swing的 ...

最新文章

  1. 使用colab平台进行训练
  2. 13.SpringMVC和Spring集成(一) 14.SpringMVC和Spring集成(二)
  3. Linux多线程编程实例解析
  4. CCIE理论第三篇-LISP技术
  5. C++学习之路 | PTA乙级—— 1028 人口普查 (20 分)(精简)
  6. Excellent Service
  7. 超全、超详的Spring Boot配置讲解笔记
  8. js便签笔记(3)——切记:appendChild()、insertBefore()是移动element节点!
  9. scp(安全副本)到ec2实例,无需密码
  10. 编码的奥秘:编码与组合
  11. 艾滋病多学科协作诊治模式的实施与成效
  12. 计算机专业老师教案,技能大赛-2015年全国中等职业学校计算机应用基础及计算机类专业课程“创新杯”教师信息化教学设计和说课比赛总结...
  13. 怎么用计算机直接截图,电脑怎么截图?使用电脑截图的多种方法
  14. 入门级理财书-小狗钱钱-读书笔记
  15. 关于跳跃连接 卷积网络
  16. javascript运行机制
  17. 【理论恒叨】【立体匹配系列】经典SGM:(1)匹配代价计算之互信息(MI)
  18. u-boot 学习系列 1 - SPL
  19. pythonocc_PythonOCC基础使用:点的性质(glsl定义)
  20. Everything Is Generated In Equal Probability HDU-6595 期望DP

热门文章

  1. 程序员如何快速敲代码呢?进来,我教你!
  2. 计算机基础(05)程序与程序设计语言
  3. 斯坦福 机器学习课程汇总
  4. AlibabaCloud-sentinel getway限流篇(1)
  5. 【MySQL】帮助的使用,清晰地解析——?/help命令
  6. C# HTML网页转换为PDF
  7. Phonopy 内网 安装 天河二号
  8. 数据测试全流程总结(小白易上手)
  9. 自动驾驶中的人工智能技术,自动驾驶与人工驾驶
  10. 社畜养生必备喝水app