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