• 1. Eclipse RCP(四)常用技术(2) 进阶开发
  • 2. 课程介绍本课程主要讲授Eclipse及RCP进阶知识 适用于Java开发工程师 面向的学员是渴望了解Eclipse RCP的各类开发工程师 全部课程时间大约是40分钟2周甫(zoofchow@hotmail.com)
  • 3. 概 要菜单和工具栏 托盘技术 进度条 状态栏(Job) 属性监听器 GC JFreeChart 在线升级 启动和停止Derby数据库3周甫(zoofchow@hotmail.com)
  • 4. 1 菜单和工具栏不同于SWT的菜单和工具栏需要分别创建menu和coolbar,RCP的菜单和工具栏的菜单项和工具项可以统一起来创建一个Action类即可,这点和JFace类似. 从Action的行为上来看,一般做三件事: 执行某个后台任务. 打开一个对话框 打开视图或者编辑器4周甫(zoofchow@hotmail.com)
  • 5. 创建Action创建一个Action需要继承自org.eclipse.jface.action.Action这个类,其代码结构为: public class SimpleAction extends Action{ public SimpleAction(){} public void run(){} } 在构造方法中构建这个Action,常用API有: setId(“***.***.***.SimpleAction”);//注册ACTION setText(“示例Action@ALT+S”);//设置菜单文字及快捷键 setToolTipText(“示例Action”);//作为工具栏使用时的提示文本 setImageDescriptor(AbstractUIPlugin.imageDescriptorFormPlugin(“**.**.**.Demo”,”icons/simpleaction.gif”));//设置图标 注意imageDescriptorFormPlugin方法需要2个参数:项目ID号,和图片文件名,实际上这是找到图片的绝对路径 在run()方法中实现需要的业务代码,打开某个视图或者执行某个任务等等。 5周甫(zoofchow@hotmail.com)
  • 6. 创建菜单创建菜单的步骤: 在ApplicationActionBarAdvisor类的makeAction()方法中实例化Action; 在fileMenuBar()方法中将Action作为菜单项加入到菜单中. 首先创建MenuManager(相当于顶级菜单,也可以作为子菜单用): MenuManager menuCodeParse = new MenuManager("代码分析", "codeParse"); 参数为:菜单文本,菜单ID号 将Action加入到MenuManager: menuUserOption.add(simpleaction); 将MenuManager添加到菜单栏: menuBar.add(menuUserOption); menuBar是filemenuBar的参数.6周甫(zoofchow@hotmail.com)
  • 7. 创建工具栏在ApplicationActionBarAdvisor类的fillCoolBar()中将构建好的Action添加进来即可. 如同菜单,工具栏也需要一个ToolBarManager来管理Action: ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT); coolBar.add(toolBarManager); //coolBar是fillCoolBar的参数 toolBarManager.add(simpleaction); SWT.FLAT设置工具栏的样式为平滑(工具项不凸出) 如果工具项之间要分组可以用coolBar.add(new Separator())加根竖的分离线 7周甫(zoofchow@hotmail.com)
  • 8. 2 托盘技术托盘(Tray)技术主要实现以下2个目的: 程序启动或关闭(非退出)时自动最小化到Windows右下角的系统托盘区 用户可以随时通过托盘打开程序,恢复窗口. 另外,托盘技术中应当关注的功能有: 菜单项 图标管理8周甫(zoofchow@hotmail.com)
  • 9. 托盘对象*托盘对象的获取方法: Tray tray = getWindowConfigurer().getWindow().getShell().getDisplay().getSystemTray(); 如同Table等容器一样,Tray也是一个容器,给Tray添加内容就要用TrayItem对象来管理. 给Tray添加托盘项(TrayItem): TrayItem trayItem = new TrayItem(tray, SWT.NONE); 给TrayItem设置文字和图标: trayItem.setImage(Image-Of-Tray); trayItem.setToolTipText(“托盘示例”); 然后将这段代码放置在ApplicationWorkbenchWindowAdvisor的postWindowOpen()方法中,因为需要创建Display后,程序窗口没打开之前托盘就能开始工作,即实现其目的之一。9周甫(zoofchow@hotmail.com)
  • 10. 托盘监听器现在托盘看起来: 但它还不能做事,现在给托盘添加事件以实现托盘功能之二: 单击托盘图标打开程序 trayItem.addListener(SWT.Selection,new Listener(){ public void handleEvent(Event event){ //恢复程序界面 } });10周甫(zoofchow@hotmail.com)
  • 11. 关闭程序窗口关闭程序窗口而不是退出,只需要调用shell的setMinimized(true)和setVisible(false)即可. 调用的切入点在ApplicationWorkbenchWindowAdvisor的preWindowShellClose()中, 调用上述2个方法后shell仅仅只是隐藏而不会真的关闭了.11周甫(zoofchow@hotmail.com)
  • 12. 加上菜单如同系统菜单和工具栏一样,Tray的菜单项也是Action 给托盘添加右键菜单: trayItem.addListener(SWT.MenuDetect, new Listener(){ public void handleEvent(Event event){ //若干Action } }); 现在托盘基本上可以工作了.12周甫(zoofchow@hotmail.com)
  • 13. 完整的托盘更好的托盘(其中有一个定时提示的线程,如果不需要就将线程屏蔽): 见Code 7~11. 13周甫(zoofchow@hotmail.com)
  • 14. 3 进度条当需要较长时间的操作而用户无法与程序交互时, 应该向用户显示一个进度条以提示正在操作及操作进度,这有利于提高用户的耐心,也是软件友好性的体现之一. 实现进度条可以用的有: SWT的ProgressBar JFace的ProgressMonitorDialog14周甫(zoofchow@hotmail.com)
  • 15. ProgressMonitorDialogProgressMonitorDialog构造方法: public ProgressMonitorDialog(Shell parent); ProgressMonitorDialog默认样式: SWT.BORDER | SWT.TITLE | SWT.APPLICATION_MODAL 其运行示例:15周甫(zoofchow@hotmail.com)
  • 16. ProgressMonitorDialog详解ProgressMonitorDialog重要方法: run(boolean fork, boolean cancelable, IRunnableWithProgress runnable); 调用这个方法,进度条才开始工作,其参数: fork 是否(true)在单独的线程中运行 cancelable 对话框的取消按钮是否可用 runnable 是一个接口,需要我们来实现: IRunnableWithProgress rwp = new IRunnableWithProgress(){ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException{ //操作代码 } }; 可见,这个接口的run()方法才是我们真正写代码的地方16周甫(zoofchow@hotmail.com)
  • 17. IProgressMonitor APIIProgressMonitor常用方法: beginTask(String name, init totalWork); 任务开始,必须调用的方法,其参数: name : 任务的名称,即前图的” “正在登录数据库,请稍候......”文字部分; totalWork: 大概的任务总数,如果无法估算,则用IProgressMonitor.UNKNOWN; Done() 任务完成 isCanceled() 当前任务是否被取消 setCanceled(boolean value) 设置任务的取消状态 subTask(String) 子任务开始,其提示文字 worked(int work) 通知线程已经完成的任务数,如果任务数已知,则进度条前进1步17周甫(zoofchow@hotmail.com)
  • 18. 进度条对话框示例*任务数未知:任务数已知:18周甫(zoofchow@hotmail.com)
  • 19. 进度条模板总结前面的过程,可以得出进度条对话框的模板: 见Code 12.19周甫(zoofchow@hotmail.com)
  • 20. 4 状态栏Eclipse状态栏位于窗口的底部,可以显示图标、文本信息和进度条(不同于ProgressMonitorDialog). 要使状态栏可见,ApplicationWorkbenchWindowAdvisor的preWindowOpen()方法中设置了configurer.setShowStatusLine(true); 状态栏常用区域:Fast Views 可以将视图拖入其中快速访问,或者临时信息Contributions 附加信息Jobs Progress 执行的Job,形如进度条20周甫(zoofchow@hotmail.com)
  • 21. 临时信息在ApplicationWorkbenchWindowAdvisor中的postWindowOpen()方法中添加代码即可,示例如下: IstatusLineManager statusline = getWindowconfigurer().getActionBarConfigurer().getStatusLineManager(); statusline.setMessage(Image-of-yours,”临时信息示例文字”); 这段信息在刚打开时出现,激活某个视图后将消失21周甫(zoofchow@hotmail.com)
  • 22. Contributions使用contributions区域,需要自定义一个扩展自ContributionItem的类,在该类的fill()方法中加入要显示的图片和文字. 然后改写ApplicationActionBarAdvisor的fillStatusLine(IStatusLineManager statusLine)方法,将自定义的类添加给statusLine即可. (见Code 13)22周甫(zoofchow@hotmail.com)
  • 23. Job除了进度条这种对于耗时较长的任务友好提示外,还有一种在状态栏中使用的进图条即Job. 一个Job可以看作是一个完成单一功能的处理单元,由Job管理器负责调度管理并可反复运行. 23周甫(zoofchow@hotmail.com)
  • 24. 示例Job可以在视图内随处调用 (见Code14) 24周甫(zoofchow@hotmail.com)
  • 25. 5 属性监听器在RCP程序开发当中常常会遇到数据同步的问题,也就是说某个视图的数据发生改变,而其他视图能够响应这个改变. 这里就要用到属性监听器,属性监听器的原理来自设计模式:观察者 (详见:07 设计模式(五)(Observer观察者模式))25周甫(zoofchow@hotmail.com)
  • 26. RCP的ObserverRCP中属性改变监听模式就是对Observer模式的一个实践.其大致原理是: 在这个模式中有一个属性提供方(主题提供方),暴露一个属性(主题),另外有一个或者多个属性监听方(订阅者),当属性提供方的主题发生改变时,监听方收到改变作出相应操作. 属性监听方需要实现IPropertyChangeListener接口,在方法propertyChange中给出操作处理. 26周甫(zoofchow@hotmail.com)
  • 27. 实现属性监听模式步骤如下: 建立一个管理属性监听方的类,这个类用于注册对主题感兴趣各个视图.如果属性发生改变就立刻通知各监听者(调用监听者实现的propertyChange()方法) (见Code 15) 监听者将自己注册到属性监听者管理类. 如: //监听属性改变 CurrentProjectPropertyChange.getInstance().addPropertyChangeListener(IConstants.VIEW_PIEDIAGRAM_ID, this); 如果属性提供方的属性发生改变,就发出通知: // 激活所有监听项目改变的监听器相关事件 CurrentProjectPropertyChange.getInstance().firePropertyChangeListener();27周甫(zoofchow@hotmail.com)
  • 28. 6 GC当有特殊的需要比如特殊的按钮而SWT/JFace不能提供时,就可以用GC(Grphics Context)来自己设计控件或者其他需求. 一些报表图形, 可以用开源的图表工具来完成,但简单的如饼形图,可以采用GC来制作.28周甫(zoofchow@hotmail.com)
  • 29. GC API用GC画饼形图,常用画曲线的方法: drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) x,y为左上角坐标 width,height为曲线的宽度和长度 startAngle为横方向开始弧度 arcAngle为曲线画过的弧度 如果width=height,则为圆形 曲线画好后用以下方法填充颜色: fileArc(int x, int y, int width, int height, int startAngle, int arcAngle)x,y窗口横座轴窗口纵座轴圆心坐标(x+widht,y+height))startAnglearcAngle29周甫(zoofchow@hotmail.com)
  • 30. 示例代码如下: Canvas drawing = new Canvas(this,SWT.NONE); drawing.addPaintListener(new PaintListener() { public void paintControl(PaintEvent event){ event.gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE)); event.gc.drawArc(50,50,200,160,60,210); event.gc.fillArc(50,50,200,160,60,210); } });30周甫(zoofchow@hotmail.com)
  • 31. 7 JFreeChartJFreeChart是开放源代码站点SourceForge.net上的一个JAVA项目,它主要用来各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。这些不同式样的图表基本上可以满足开发中的要求。如图是一个柱状图的示例31周甫(zoofchow@hotmail.com)
  • 32. 下载JFreeChart下载地址: http://www.jfree.org/jfreechart/download.html 该公司主要产品: JFreeReport:报表解决工具 JFreeChart:Java图形解决方案(Application/Applet/Servlet/Jsp) JCommon:JFreeReport和JFreeChart的公共类库 JFreeDesigner:JFreeReport的报表设计工具 而我们只需要下载JFreeChart即可,其中已经包含了JCommon.32周甫(zoofchow@hotmail.com)
  • 33. 使用JFreeChartJFreeChart的使用非常简单,其机制为: 先得到一个Dataset(数据),然后从它那里创造出一个Chart(图)。 (见Code16-18). 33周甫(zoofchow@hotmail.com)
  • 34. 配置JFreeChart按 05 Eclipse使用讲座(五)(插件安装与制作)将JFreeChart的jfrechart-1.0.9.jar和jcommon-1.0.12.jar2个包制作成插件。 将插件复制到目标平台的plugins目录下. 回到开发平台重读目标平台的插件(WindowsPreferencesTarget Platform). 然后打开项目的plugin.xml在Dependencies标签页中将其添加到插件依赖中. JFreeChart配置完毕.34周甫(zoofchow@hotmail.com)
  • 35. 8 在线升级利用Eclipse提供的专门的Update组件,可以通过HTTP、WEB实现在线升级。 要实现产品在线升级, 首先需要配置项目的update插件依赖项,步骤如下: Step 1.配置Dependencies插件依赖 打开plugin.xml,切换到Dependencies页,Add..., 在Plug-in Selection对话框中将: org.eclipse.update.configurator org.eclipse.update.core org.eclipse.update.ui org.eclipse.update.scheduler 4个插件添加进来,保存退出. Step 2. 配置产品的Configuration 打开产品配置(*.product)的Configuration页,点击Add Required Plug-ins,Eclipse会自动将org.eclipse.update.configurator、org.eclipse.update.core.win32等包添加到产品配置库中 35周甫(zoofchow@hotmail.com)
  • 36. 创建Feature功能部件项目Eclipse产品由若干插件组成,每个插件包含提供产品具体功能的代码。产品的各个插件一起组合成功能部件。 功能部件用于描述并组合产品的不同功能。功能部件只包含描述相关插件的更新信息,不包含任何代码。 功能部件可以独立下载和安装的最小单元.36周甫(zoofchow@hotmail.com)
  • 37. 新建Feature项目选择NewProjectPlug-in DevelopmentFeature Project 第一步中给Feature项目起个名字,一般和开发项目名相同加上.feature37周甫(zoofchow@hotmail.com)
  • 38. 新建Feature项目第二步第二步,勾选要升级的项目或者插件38周甫(zoofchow@hotmail.com)
  • 39. 修改General Information项目建成后将打开feature.xml,在Overview页的General Information中输入: Update Site URL: http://localhost:8080/net.zoof.kayaka.update/ Update Site Name: kayaka update site.39周甫(zoofchow@hotmail.com)
  • 40. 新建Update项目项目类型: NewProjectPlug-in DevelopmentUpdate Site Project.项目名称这个要勾选40周甫(zoofchow@hotmail.com)
  • 41. 映射Feature项目Update项目建好后会打开site.xml文件,Add Feature…选择映射的Feature项目,如图: 然后Build,对选择的feature进行构建,构建好的文件将会放在项目的feature和plugin文件夹下。41周甫(zoofchow@hotmail.com)
  • 42. Archives页在site.xml的Archives页分别填写: URL:http://localhost:8080/net.zoof.kayaka.update/ Description: kayaka update site 描述更新站点并指定更新站点的地址。42周甫(zoofchow@hotmail.com)
  • 43. Update实体站点在tomcat/webapps下建立一个j2ee站点:net.zoof.kayaka.update (模板文件见附件) 然后将$Eclipse-workspace\net.zoof.kayaka.update下的所有文件复制到tomcat/webapps/net.zoof.kayaka.update下43周甫(zoofchow@hotmail.com)
  • 44. Update Action在RCP项目中新建一个Update Action.这个Action或者作为系统菜单或者作为工具栏,方便用户傻瓜式在线升级软件. (见Code 19). 在线升级站点URL当然也不能硬编码,这里可以用自建的RCP的系统属性文件覆盖默认的(默认的系统属性文件无内容),步骤如下: 项目中新建立一个configuration文件夹,建立文件:config.ini(文件内容见Code 20). 打开kayaka.product,切换到Configuration页,配置config.ini文件,如图:44周甫(zoofchow@hotmail.com)
  • 45. 9 启动和停止Derby数据库启动和停止Derby数据库的代码见Code 21. 启动数据库是应用启动前做好的事,所以加在Application.java中,如: public Object run(Object args) throws Exception{ Display display = PlatformUI.createDisplay(); BootOrShutdownDerby.getInstance().bootDerbyServer(true); ….. 关闭数据库则在工作台关闭前,即ApplicationWorkbenchAdvisor.java中: public boolean preShutdown(){ BootOrShutdownDerby.getInstance().bootDerbyServer(false); return super.preShutdown(); }45周甫(zoofchow@hotmail.com)
  • 46. 附录一:中文化的问题如果最终产品中出现中文乱码的问题,可以如下方法解决: 方法一.将项目的属性中Info-Text file encoding设置为GBK. 方法二.方法一如果还不能解决,则将GBK改成UTF-8,然后: plugin.xml右键菜单PDE ToolsCreate Ant Build File生成build.xml plugin.xml的Build页,勾选Custom Build. 打开build.xml找到节点,添加属性encoding=“utf-8” 重新导出产品即可46周甫(zoofchow@hotmail.com)
  • 47. 附录二:产品图标的问题产品图标默认的使用Eclipse的图标,要更换图标使用一个小工具Resource Hacker即可,其下载地址:http://angusj.com/resourcehacker47周甫(zoofchow@hotmail.com)
  • 48. 附录三:附件空白的j2ee站点: 48周甫(zoofchow@hotmail.com)