- 浏览: 10090 次
- 性别:
- 来自: 上海
最近访客 更多访客>>
文章分类
最新评论
-
lostyue:
大哥...请教下病人前面的图标能显示吗?如果PersonLab ...
使用Eclipse RCP进行桌面程序开发(三):视图和透视图 -
pignut_wang:
正好在看这个部分,非常适用,
使用Eclipse RCP进行桌面程序开发(三):视图和透视图
在使用Eclipse RCP进行桌面程序开发(一):快速起步中,我们通过Eclipse的插件开发向导,逐步建立了一个RCP应用程序,但是,这个程序没有任何功能,难以激起我们学习的兴趣。在这一节,我们将一起探索怎样在程序中添加菜单和工具条。先看一下成果:
图一、图二:带有菜单和工具条的RCP程序
图三:工具栏上的按钮的提示文本
图四:点击菜单项或者工具栏按钮后,弹出一个简单的对话框。
这里需要说明一点,为什么要在讲菜单和工具栏的时候一起讲对话框,这是因为对话框是我们所能想到的最简单最直接的用户交互方式,在对话框上可以添加各种各样的控件来实现复杂的功能,为了让我们点击菜单项的时候能够看到效果,这里就用了一个简单的对话框。当然,当我们以后接触到视图、编辑器和透视图这样的概念之后,我们能使用的用户交互方式就不仅仅只是对话框了。
打开我们上一节使用向导建立的工程,可以发现工程下面自动生成了如下文件:
Application.java
ApplicationWorkbenchAdvisor.java
ApplicationWorkbenchWindowAdvisor.java
ApplicationActionBarAdvisor.java
Perspective.java
plugin.xml
这里的Application.java是我们整个程序的入口点,我们的程序运行的时候,会先执行Application的run方法,run方法的代码如下:
1 public Object run(Object args) throws Exception { 2 Display display = PlatformUI.createDisplay(); 3 try { 4 int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor()); 5 if (returnCode == PlatformUI.RETURN_RESTART) { 6 return IPlatformRunnable.EXIT_RESTART; 7 } 8 return IPlatformRunnable.EXIT_OK; 9 } finally { 10 display.dispose(); 11 } 12 }
在第4行我们可以看出,该入口函数将创建用户界面的工作交给了ApplicationWorkbenchAdvisor类。接着,我们打开ApplicationWorkbenchAdvisor.java,代码如下:
1 public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor { 2 3 private static final String PERSPECTIVE_ID = " cn.blogjava.youxia.rcp_start.perspective " ; 4 5 public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) { 6 return new ApplicationWorkbenchWindowAdvisor(configurer); 7 } 8 9 public String getInitialWindowPerspectiveId() { 10 return PERSPECTIVE_ID; 11 } 12 }
可以看出,这个类的工作就是为我们的程序指定默认的透视图,然后把创建窗口的工作交给了ApplicationWorkbenchWindowAdvisor类。接着,我们打开ApplicationWorkbenchWindowAdvisor.java文件,看到代码如下:
1 public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { 2 3 public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) { 4 super (configurer); 5 } 6 7 public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) { 8 return new ApplicationActionBarAdvisor(configurer); 9 } 10 11 public void preWindowOpen() { 12 IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); 13 configurer.setInitialSize( new Point( 600 , 450 )); 14 configurer.setShowCoolBar( true ); 15 configurer.setShowStatusLine( false ); 16 configurer.setTitle( " 第一个RCP程序 " ); 17 18 } 19 20 }
这个类的功能很强大,我们可以重载它的preWindowCreate、postWindowCreate、preWindowOpen、postWindowOpen等方法,以便修改我们窗口的外观。在这里可以看出,我们重载了preWindowOpen方法来设置窗口的大小和让工具栏可见。很显然,这个类的另外一个功能,就是把创建菜单和工具栏的任务交给了ApplicationActionBarAdvisor类。
到这里,谜底已经揭晓,要创建我们自己的菜单和工具条,就一定是在ApplicationActionBarAdvisor.java中做文章了。不错,打开这个文件,我们可以看到这个类有两个重要的方法:
protected void makeActions(IWorkbenchWindow window);
protected void fillMenuBar(IMenuManager menuBar);
我们可以在makeActions方法中创建我们的Action,什么是Action呢?Action是jface中的一个概念,在jface中通过org.eclipse.jface.action中的Action和ActionContributionItem类实现了视图和处理代码的分离,这样无论何时用户触发了一个控件的事件,都会激活一个相应的Action类实例来进行时间处理。毫无疑问,我们的菜单项是一个Action类的子类了。
下面请看ApplicationActionBarAdvisor.java的源代码:
1 package cn.blogjava.youxia.rcp_start; 2 3 import org.eclipse.jface.action.IMenuManager; 4 import org.eclipse.jface.action.MenuManager; 5 import org.eclipse.ui.IWorkbenchWindow; 6 import org.eclipse.ui.application.ActionBarAdvisor; 7 import org.eclipse.ui.application.IActionBarConfigurer; 8 import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction; 9 import cn.blogjava.youxia.actions.Action1; 10 11 public class ApplicationActionBarAdvisor extends ActionBarAdvisor { 12 13 private IWorkbenchAction action1; 14 15 public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) { 16 super (configurer); 17 } 18 19 protected void makeActions(IWorkbenchWindow window) { 20 action1 = new Action1(window); 21 action1.setText( " 第一个菜单项 " ); 22 action1.setId( " cn.blogjava.youxia.actions.action1 " ); 23 register(action1); 24 } 25 26 protected void fillMenuBar(IMenuManager menuBar) { 27 MenuManager newMenu = new MenuManager( " 第一个菜单 " , " cn.blogjava.youxia.firstmenu " ); 28 menuBar.add(newMenu); 29 newMenu.add(action1); 30 } 31 32 }
可以看出,我们通过创建cn.blogjava.youxia.actions.Action1类的实例来创建一个菜单项,然后把它加入到菜单newMenu中,然后再把newMenu加入menuBar中,整个过程很容易理解。那么register(action1)是做什么的呢?这是为了把我们的Action的实例注册到工作台中,这样当我们的工作台销毁的时候,我们的Action也可以被销毁。
下面请看Action1类的源代码:
1 package cn.blogjava.youxia.actions; 2 3 import org.eclipse.jface.action.Action; 4 import org.eclipse.ui.IWorkbenchWindow; 5 import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction; 6 import cn.blogjava.youxia.rcp_start.FirstDialog; 7 8 9 public class Action1 extends Action implements IWorkbenchAction { 10 11 private IWorkbenchWindow workbenchWindow; 12 13 public Action1(IWorkbenchWindow window) { 14 if (window == null ) { 15 throw new IllegalArgumentException(); 16 } 17 18 this .workbenchWindow = window; 19 } 20 21 public void run() { 22 // make sure action is not disposed 23 if (workbenchWindow != null ) { 24 // 在这里添加功能 25 FirstDialog dg = new FirstDialog(workbenchWindow.getShell()); 26 dg.open(); 27 28 } 29 } 30 31 public void dispose() { 32 workbenchWindow = null ; 33 34 } 35 36 }
在构造函数中保存我们工作台窗口的引用,在run方法中执行功能,是不是很简单?在这里,我们用到了一个对话框类cn.blogjava.youxia.rcp_start.FirstDialog,这个类从org.eclipse.swt.widgets.Dialog类继承,熟悉swt的朋友一定不会陌生。我建议大家可以使用Designer插件,这个插件对swt/jface提供非常好的可视化支持,在这个对话框中,我们只简单的添加了两个按钮。
FirstDialog.java源文件如下:
1 package cn.blogjava.youxia.rcp_start; 2 3 import org.eclipse.swt.SWT; 4 import org.eclipse.swt.events.SelectionAdapter; 5 import org.eclipse.swt.events.SelectionEvent; 6 import org.eclipse.swt.widgets.Button; 7 import org.eclipse.swt.widgets.Dialog; 8 import org.eclipse.swt.widgets.Display; 9 import org.eclipse.swt.widgets.Shell; 10 11 12 public class FirstDialog extends Dialog { 13 14 protected Shell shell; 15 16 private int result; 17 18 public FirstDialog(Shell parent, int style) { 19 super (parent, style); 20 } 21 22 public FirstDialog(Shell parent) { 23 this (parent, SWT.NONE); 24 } 25 26 public int open() { 27 createContents(); 28 shell.open(); 29 shell.layout(); 30 Display display = getParent().getDisplay(); 31 while ( ! shell.isDisposed()) { 32 if ( ! display.readAndDispatch()) 33 display.sleep(); 34 } 35 return result; 36 } 37 38 protected void createContents() { 39 shell = new Shell(getParent(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); 40 shell.setSize( 150 , 70 ); 41 shell.setText( " 第一个对话框 " ); 42 43 final Button okButton = new Button(shell, SWT.NONE); 44 okButton.addSelectionListener( new SelectionAdapter() { 45 public void widgetSelected(SelectionEvent e) { 46 result = 1 ; 47 shell.dispose(); 48 } 49 } ); 50 okButton.setText( " OK " ); 51 okButton.setBounds( 10 , 10 , 48 , 22 ); 52 53 final Button cancelButton = new Button(shell, SWT.NONE); 54 cancelButton.addSelectionListener( new SelectionAdapter() { 55 public void widgetSelected(SelectionEvent e) { 56 result = 2 ; 57 shell.dispose(); 58 } 59 } ); 60 cancelButton.setText( " Cancel " ); 61 cancelButton.setBounds( 89 , 10 , 48 , 22 ); 62 } 63 64 } 65
上面所讲的,只是添加菜单和工具栏的第一种方法,这种方法把构建菜单的工作以静态代码的方式加入到了ApplicationActionBarAdvisor类中,如果需要修改用户界面,则需要修改代码并重新编译。
添加菜单项的第二种方法就要简单得多,而且修改起来也方便,还可以对菜单项实现更加灵活的控制,但是,需要对Eclipse的插件基础有比较好的了解。那这第二种方法就是通过扩展actionSets扩展点来添加菜单。
对扩展点的扩展,可以通过编辑plugin.xml文件了实现,比如我们添加的第二个菜单项,其配置文件如下:
1 < extension 2 id ="cn.blogjava.youxia.actionset" 3 name ="我的菜单扩展" 4 point ="org.eclipse.ui.actionSets" > 5 < actionSet 6 description ="第一个扩展" 7 id ="RCP_Start.actionSet1" 8 label ="RCP_Start.actionSet1" 9 visible ="true" > 10 < action 11 class ="cn.blogjava.youxia.actions.Action2" 12 icon ="icons/alt_window_16.gif" 13 id ="RCP_Start.action2" 14 label ="第二个菜单项" 15 menubarPath ="cn.blogjava.youxia.firstmenu/additions" 16 style ="push" 17 toolbarPath ="additions" 18 tooltip ="第二个菜单项的按钮" /> 19 </ actionSet > 20 </ extension >
其实Eclipse为我们提供了很好的可视化plugin.xml的编辑器,如下图,我们可以对菜单的外观进行和行为进行灵活的控制:
从配置文件中我们可以看到,我们为这第二个菜单项指定的Action是cn.blogjava.youxia.actions.Action2类,这个类我们必须实现org.eclipse.ui.IWorkbenchWindowActionDelegate接口,这个接口中比org.eclipse.jface.actions.Action中多定义了一个方法public void selectionChanged(IAction action, ISelection selection),这个方法是必须的,以便工作台窗口在用户选定哪一项资源的时候通知我们的Action类的实例。其代码如下:
1 package cn.blogjava.youxia.actions; 2 3 import org.eclipse.jface.action.IAction; 4 import org.eclipse.jface.viewers.ISelection; 5 import org.eclipse.ui.IWorkbenchWindow; 6 import org.eclipse.ui.IWorkbenchWindowActionDelegate; 7 import cn.blogjava.youxia.rcp_start.FirstDialog; 8 9 public class Action2 implements IWorkbenchWindowActionDelegate { 10 11 private IWorkbenchWindow window; 12 13 public void dispose() { 14 // TODO 15 16 } 17 18 public void init(IWorkbenchWindow window) { 19 // TODO 20 this .window = window; 21 22 } 23 24 public void run(IAction action) { 25 // TODO 26 FirstDialog dg = new FirstDialog(window.getShell()); 27 dg.open(); 28 29 } 30 31 public void selectionChanged(IAction action, ISelection selection) { 32 // TODO 33 34 } 35 36 }
总结:通过向工作台中添加菜单和工具栏,并使用对话框作为与用户交互的基础,我们已经基本上可以构建功能比较复杂的程序了。但这仅仅只是RCP编程的开端。下一节,我们将一起探索Eclipse的透视图和视图。
相关推荐
火龙果软件工程技术中心 在使用EclipseRCP进行桌面程序开发(一):快速起步中,我们通过Eclipse的插件开发向导,逐步建立了一个RCP应用程序,但是,这个程序没有任何功能,难以激起我们学习的兴趣。在这一节,我们...
火龙果软件工程技术中心 所谓RCP,就是...使用RCP,我们可以开发界面象Eclipse这样漂亮的桌面程序,比如医院管理系统啊、CAD软件等等。遗憾的是,目前在国内基本上找不到关于RCP的中文资料,我们只能通过自
利用SWT技术,基于WindowBuilder Eclipse 插件开发 桌面应用小程序详细步骤
将涉及以下内容:创建第一个RCP程序,创建菜单和工具栏,查看,编辑,对话,外部JAR的用法,向一个RCP应用程序产品中添加标志和帮助。每一章都基本独立于其他章节。欢迎访问我的网站——www.xeclipse.com。
Eclipse Rcp 桌面程序开发中文教程
火龙果软件工程技术中心 EclipseRCP开发中,和用户进行交互最多的界面,应该是视图了,而透视图就是将已有的视图、菜单、工具栏、编辑器等等进行组合和布局。看完这一节,我们就可以建立如下图这样的程序界面了。...
Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT
clipse RCP允许开发者使用eclipse结构风格设计...将涉及以下内容:创建第一个RCP程序,创建菜单和工具栏,查看,编辑,对话,外部JAR的用法,向一个RCP应用程序产品中添加标志和帮助。 每一章可能都基本独立于其他章节
高级篇(第6-12章)系统讲解了Eclipse RCP应用开发的基础知识、Eclipse RCP软件产品各个组成部分的构建方法,以及Eclipse RCP扩展的使用和扩展点的开发,掌握这些技术知识的读者将能构建一个结构完整的Eclipse RCP...
eclipse rcp应用系统开发方法与实战源代码.zip
本文讲述如何利用Eclipse RCP架构来进行应用开发。本文涵盖了创建RCP应用的各个方面:使用命令、视图、编辑器、对话框及创建与部署Eclipse产品。
eclipse icons,用来开发rcp桌面应用程序
EclipseRcp 例子程序
Eclipse RCP 开发资料打包下载 目录如下: RCP程序设计.pdf(推荐) Addison.Wesley.Eclipse.Rich.Client.Platform.Designing.Coding.and.Packaging.Java.Applications.Oct.2005.chm Eclipse+RCP入门.pdf example_...
看完这篇文章,可以开发如下的界面:没有嵌入ActiveX控件的...使用Windows系统中丰富的ActiveX控件资源,我们可以实现功能非常强大的程序。在Windows平台下,SWT图形工具包提供了对OLE的支持,ActiveX控件和OLE文档都
ECLIPSE RCP项目开发源程序(中文注释)
看完这篇文章,可以实现如下界面:当我第一次看到RCP的时候,我就梦想着有一天能够用它开发界面华丽的2D和3D程序,经历过前面的探索,今天终于可以揭开2D绘图的神秘面纱。在包资源管理器的插件依赖项中,我们一眼就...
Eclipse4的插件开发教程比较少,之前搜索到的基本是eclipse官网的全英文版本,可能现在做桌面应用的没那么多,搜索到的都是多年前的资料。英文的看的比较吃力,分享一个中文的,部分内容还是有英文,大部分都已经...
Eclipse Rich Client Platform (RCP) 的目标是在各种不是集成开发环境 (IDE) 的最终用户应用程序中使用 Eclipse。随着 Eclipse V3.1 的发布,创建 RCP 应用程序变得容易。本教程将指导您一步步创建自己的 RCP 应用...