- 浏览: 377287 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
zxjlwt:
学习论。确实很全啊。欢迎交流http://surenpi.co ...
eclipse dialog 对话框 大全 -
zxjlwt:
很好。http://surenpi.com
eclipse 源码泛读 -
string2020:
有卵用???
activiti 第一个例子 helloworld -
ysj_csdn:
能给个正确的例子?
activiti 第一个例子 helloworld -
zxjlwt:
学习了。http://surenpi.com
Eclipse扩展点介绍
RCP(Rich Client Platform),即富客户端平台,是 Eclipse 提供给开发者的强大的开放性开发平台,允许开发基于 Eclipse 的应用程序,风格将与 Eclipse 相同。由于是基于 Eclipse,因此 Eclipse 中许多有用的系统类,就可以在开发者自己的 RCP 应用中利用起来,这样不仅减少了开发量,也大大提高了系统稳定性。本文介绍了一些笔者在实际开发中用到的 Eclipse 系统类,详细的认识它们可以为你的 RCP 开发提供捷径。
本文将逐一的介绍几个实用类,顺序如下面的列表。
- SafeRunner 的用法
- BusyIndicator 的用法
- PreferencesUtil 的用法
- IDialogSettings 的用法
- FileLocator 的用法
- WorkbenchHelp 的用法
- MessageDialogWithToggle 的用法
- 视图 ViewPart 中的 IMemento
- 重新认识 Display 类
列表的每一部分分别讲述一个实用类的具体用法,文章的附件中会有这些类使用的示例代码,每个实用类对应的使用示例代码以“类名” + UseCase.java 命名 。为了方便读者查看效果,附件程序中每个类的示例代码都有一个对应的按钮,读者可以点击对应的按钮查看效果,附件程序界面如图 1 所示。读者将附件导入 Eclipse 工作空间即可运行。
图 1. 示例程序界面
在 Java 开发中,很多时候所写的语句可能抛出异常,这就需要程序员抒写 try … catch 语句,将异常语句包围,在 catch 语句块中对异常进行处理,在 RCP 应用中对意外抛出的异常一般都需要先记录到日志文件中,方便日后查询,然后根据需求进行别的处理。用传统的方法处理 RCP 中的异常,不仅仅要写 try … catch 语句,还需要编写记录 Eclipse 日志的代码,如果异常语句多了的话,代码就会显得臃肿,不易理解。
Eclipse 提供了一个类,名为 SafeRunner,允许开发者将异常代码放入 SafeRunner 的 run 方法中执行,SafeRunner 默认对异常代码添加 try … catch 语句,捕捉异常并且将异常信息记录日志,同时 SafeRunner 也允许开发者对异常进行其他处理。SafeRunner 的使用方法如清单 1 所示。
清单 1. SafeRunner 的使用
System.out.println("语句 1"); SafeRunner.run(new ISafeRunnable() { @Override public void run() throws Exception { // 异常代码的执行位置 System.out.println("语句 2(可能抛出异常)"); throw new RuntimeException("语句 2 的异常"); } @Override public void handleException(Throwable exception) { // 对异常进行其他处理 exception.printStackTrace(); } }); System.out.println("语句 3"); |
在 handleException 方法中可以对异常进行其他的处理,比如打印异常信息、记录到数据库等等。
当在 RCP 应用中执行清单 1 中的代码,它的日志文件就会记录抛出的异常,效果如图 2 所示。
图 2. 使用 SafeRunner 的日志文件
使用 SafeRunner 使得 RCP 的异常处理变得规范化,代码量减少,更易维护,无需自己编写日志记录代码。
当试图在执行一个线程任务的同时,主线程停止等待,直到任务执行完毕,这个需求开发者一般会想到使用 Display 的 sync 方法,将任务放入主线程执行,这样执行的缺点是,任务执行时主线程停止响应,给人程序已死的感觉。因此为了解决这个缺点,就可以使用 BusyIndicator 执行任务,它使得任务执行时鼠标显漏斗状,标识主线程忙碌,实际任务在另一线程执行。附件程序中点击”BusyIndicator”按钮就会展示 BusyIndicator 的使用效果,执行的代码如清单 3 所示。
清单 2. BusyIndicator 的示例代码
public static void handleClick(Button button) { button.setText("Running..."); BusyIndicator.showWhile(button.getDisplay(), new SleepThread(5000)); button.setText("BusyIndicator"); } static class SleepThread extends Thread { private long ms; public SleepThread(long ms) { this.ms = ms; } public void run() { try { sleep(ms); } catch (InterruptedException e) { } } } |
用户点击”BusyIndicator”按钮,就改变”BusyIndicator”按钮的标签,改为 Running … , 执行的任务在 SleepThread 中,使用线程的 sleep 方法,模拟任务执行 5 秒。任务执行过程中,主程序虽然没有响应,但是不会有程序已死的感觉,鼠标显示漏斗状。执行任务后按钮的标签恢复成“BusyIndicator”, 鼠标箭头也恢复正常。
Eclipse 提供了首选项扩展点,允许开发者定义自己的首选项集成到 Eclipse 当中(具体的首选项扩展点的扩展方法可以查看 Eclipse 官方开发文档),正常来说,用户可以通过 Eclipse 的 Window->Preferences 菜单打开所有的首选项,然后找到自定义的首选项页。但是如果开发者希望可以通过别的方式打开自定义的首选项页时,就需要利用到 PreferencesUtil,这个类提供了打开指定首选项页的功能,附件程序中定义了一个首选项,id 为 testPreferencesUtilPage,name 为 Test PreferencesUtil Page,清单 4 是使用 PreferencesUtil 打开 id 为 testPreferencesUtilPage 的首选页的方法代码。
清单 3. PreferencesUtil 的示例代码
PreferenceDialog createPreferenceDialogOn = PreferencesUtil.createPreferenceDialogOn(null, "testPreferencesUtilPage", null, null); createPreferenceDialogOn.open(); |
读者可以在附件程序中点击“PreferencesUtil”按钮查看效果,效果如图 3 所示。
图 3. PreferencesUtil 的示例效果
IDialogSettings 是一个为对话框设置提供持久化功能的一个接口,该接口提供了键值对的存储机制,键必须是字符串,值则可以是字符串或者字符串数组(IDialogSettings 提供的方法允许值是非字符串类型,但是 IDialogSettings 的实现会将其他非字符串类型的基本类型转换为字符串类型,然后保存)。开发者希望在对话框关闭时候保存状态,打开对话框恢复状态时,就可以利用 IDialogSettings 接口了。附件程序使用 InputDialog,将用户输入的内容保存到 IDialogSettings 实例中,使用 IDialogSettings 的 save 方法将 IDialogSettings 中的信息保存到本地文件,在第二次打开 InputDialog 时,又使用 IDialogSettings 的 load 方法加载设置。代码如清单 5 所示。
清单 4. IDialogSettings 的使用
private static IDialogSettings ds = new DialogSettings("myds"); public static void handleClick() { String fileName = "c:/save.xml"; if (new File(fileName).exists()) { try { ds.load(fileName); } catch (IOException e1) { e1.printStackTrace(); } } InputDialog id = new InputDialog(null, "IDialogSettings Title", "IDialogSettings Message", ds.get("iduc") == null ? "" : ds.get("iduc"), null); if (id.open() == Window.OK) { ds.put("iduc", id.getValue()); } try { ds.save(fileName); } catch (IOException e) { e.printStackTrace(); } } |
在 InputDialog 中输入 helloworld, 点击 OK,打开清单 5 中保存的文件 c:/save.xml,它的内容如清单 6 所示。可以看出 IDialogSettings 中的信息通过调用 save 方法,保存成了一个 XML 文件格式。
清单 5. save.xml 的内容
<?xml version="1.0" encoding="UTF-8"?> <section name="myds"> <item value="helloworld" key="iduc"/> </section> |
清单5中,IDialogSettings 的实例是自己新建,它的 save 和 load 操作需要开发人员自己控制,有时候为了方便,我们可以使用已经有的 IDialogSettings 实例,让平台负责它们的读写,如 JavaPlugin.getDefault().getDialogSettings() 就可以获得 JavaPlugin 中的 IDialogSettings 实例,加载保存都归 Java 插件管理。
在 Eclipse 中编辑项目时,往往会根据需要在项目中新建一些文件,如 properties 文件等等,当我们需要在 RCP 运行时找到这些文件时,就需要利用 FileLocator 类。为此,附件程序中新建一个 properties 文件(fileLocator.properties)在项目的根目录下,内容为 filelocator=FileLocatorUseCase,接下来利用 Filelocator 找到这个属性文件,读取该文件内容,使用 Java 的资源 API 获取键为 filelocator 的 FileLocatorUseCase 值,并弹出对话框显示,代码如清单 7 所示。
清单 6. FileLocator 的使用
URL location = FileLocator.find(Platform .getBundle("eclipse_system_class"), new Path( "fileLocator.properties"), null); PropertyResourceBundle bundle = null; InputStream is = null; String aboutText = ""; if (location != null) { try { is = location.openStream(); bundle = new PropertyResourceBundle(is); } catch (IOException e) { bundle = null; } finally { try { if (is != null) is.close(); } catch (IOException e) { } } } if (bundle != null) { try { // 值 aboutText = bundle.getString("filelocator"); MessageDialog.openInformation(null, "FileLocator", aboutText); } catch (MissingResourceException e) { } } |
通过插件的 ID,使用 Platform 类的 getBundle 方法获取插件的 Bundle,FileLocator 的 find 方法相对 Bundle 的根目录寻找文件(fileLocator.properties),将获取的文件输入流封装成 PropertyResourceBundle,这样就可以根据键值 filelocator 获得 FileLocatorUseCase 值了。
在了解 WorkbenchHelp 之前,读者需要了解 Eclipse 中的帮助扩张点,这个扩张点的目的是为开发者提供自定义帮助内容的方法,该扩展点的具体使用方法可以查看 Eclipse 官方开发文档。WorkbenchHelp 类提供了快捷的 API,用以设置、显示、获得帮助扩展点的帮助。附件程序展示了如何为视图的 Composite 添加帮助,当焦点落在 Composite 时,按 F1 键,会显示定义好的帮助内容。或者点击“WorkbenchHelp”按钮,也会显示帮助内容。显示效果如图 4 所示。
图 4. 使用 WorkbenchHelp 显示帮助
为视图 Composite 设置 F1 帮助的代码如清单 8 所示。
清单 7. 设置 F1 显示帮助
public void createPartControl(Composite parent) { Composite com = new Composite(parent, SWT.NONE); ... WorkbenchHelp.setHelp(com, "eclipse_system_class.contexthelp"); } |
WorkbenchHelp 的 setHelp 方法为控件设置帮助,它的第二个参数值 eclipse_system_class.contexthel 中的 contexthelp,是附件程序扩展 org.eclipse.help.contexts 扩展点定义的 context 的 id,eclipse_system_class 则为附件程序的插件 ID,清单 8 利用 WorkbenchHelp 为 Composite 绑定了帮助,点击 F1 时显示 id 为 contexthelp 的帮助内容。当试图在其他事件(不是点击 F1)时显示帮助,WorkbenchHelp 提供了直接显示帮助的方法:WorkbenchHelp.displayHelp("eclipse_system_class.contexthelp"); 在任何事件监听器中调用 displayHelp 方法,都可以显示帮助内容。
MessageDialogWithToggle 是一个带有 CheckBox 的提示对话框,MessageDialogWithToggle 不仅保存了用户点击的按钮信息,还保存了用户是否选中了 ChekBox。MessageDialogWithToggle 在 Eclipse 中的使用例子很多,比如关闭 Eclipse 时,会弹出如图 5 的对话框。该对话框就是 MessageDialogWithToggle 的实例。
图 5. 退出 Eclipse 时的提示对话框
MessageDialogWithToggle 对话框适用于一个对话框包含两个提示问题的情况下,它的使用代码如清单 9 所示。
清单 8. MessageDialogWithToggle 的使用
MessageDialogWithToggle dialogWithToggle = new MessageDialogWithToggle(null, "MessageDialogWithToggle Title", null, "MessageDialogWithToggle Message", MessageDialog.QUESTION, new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL}, 0, "是否选中 toggle?", false); if (dialogWithToggle.open() == IDialogConstants.YES_ID) { boolean toggleState = dialogWithToggle.getToggleState(); MessageDialog.openInformation(null, "MessageDialogWithToggle", "是否选中 toggle " + toggleState); } |
执行清单 9 的代码效果将如图 6 所示。
图 6. MessageDialogWithToggle 的示例效果
Eclipse 的工作台 Workbench 被关闭的时候,会执行每个视图 (ViewPart) 的 saveState 方法,一个 IMemento 对象就会传入到 saveState 方法中,在 IMemento 对象中可以存储整型、字符串型、浮点型等数据,我们就可以将一些状态信息等存储到 IMemento 中,平台会将这些数据存储到 org.eclipse.ui metadata 目录下的 workbench.xml 文件中。下次打开视图时,平台还会从 workbench.xml 重新读取 IMemento 对象,并且传入视图的 init 方法。那么 init 方法就可以恢复上一次关闭前的状态了。
为了实现上述保存状态再恢复状态的功能,需要重写视图(ViewPart)的 init 和 saveState 方法,类似代码如清单 10 所示。
清单 9. init 与 saveState 的重写
public void init(IViewSite site, IMemento memento) throws PartInitException { super.init(site, memento); if (memento != null){ String initData = memento.getString("initdata"); // 每一次打开都会获得这个 initData. } } public void saveState(IMemento memento) { // 改变状态的话,就在关闭的时候存储到 IMemento 中 if (memento != null){ memento.putString("initdata", "IMemento init"); } } |
另外,打开视图的时候先执行 init,再执行视图的 createPartControl 方法,也就是说 init 的执行在创建组件之前,因此可以保存 init 方法的 IMemento 对象参数的引用,在 createPartControl 方法里使用,获得 IMemento 中存放的信息,这样就可以恢复上一次关闭前一些组件的属性值等。
Display 在 RCP 中具有很重要的地位,它的两个方法 sync 和 async 是同步和异步方法,sync 是将代码块立刻放入主线程执行,async 是在主线程空闲的时候再放入主线程执行。这两个方法在非主线程中更新 UI 时被大量用到。
Display 还有很多别的方法会被人忽略,但是了解这些方法或许在以后的开发中有很大的帮助,
addFilter方法用于添加全局监听器,任何在 RCP 应用中发生的同类事件都会触发 addFilter 的监听器。addFilter的使用示例代码如清单 11 所示。
清单 10. addFilter 使用示例
display.addFilter(SWT.MouseDown, new Listener() { @Override public void handleEvent(Event e) { System.out.println("filter mouse down"); } }); |
Display 提供了寻找控件的方法,叫 findWidget,用于通过句柄快速寻找控件,在控件非常复杂的情况下,可以通过记录控件的句柄号 (Control 的 handle 属性 ),调用 findWidget 方法,快速获得控件,示例代码如清单 12 所示。
清单 11. findWidget 使用示例
Button displayBtn = … ; Control d = (Control)display.findWidget(displayBtn.handle); System.out.println(d == displayBtn); |
Display 的 getFocusControl方法返回当前应用中获得焦点的 Control 对象。
Display 的 timerExec方法用于在指定毫秒数结束以后执行一段代码,为 RCP 程序提供定时执行的功能,它的代码如清单 13 所示。
清单 12. timerExec 使用示例
// 在 5 秒后执行 Runnable 代码 display.timerExec(5000, new Runnable() { @Override public void run() { System.out.println("timerExec"); } }); |
Display 的 disposeExec方法是程序退出时候的钩子,在 Display 被销毁的时候触发执行,通过这个方法允许你在程序退出时做一些收尾工作,它的示例代码如清单 14 所示。
清单 13. disposeExec 使用示例
display.disposeExec(new Runnable(){ @Override public void run() { System.out.println("disposeExec"); } }); |
本文介绍了几个 RCP 开发中可能被用到的实用类,对这些类进行了讲解和代码示例分析,通过文章的介绍,相信读者可以从中掌握这些类的使用方法,在未来的 RCP 开发中事半功倍。由于本人知识水平有限,文章中倘若有错误的地方,欢迎联系我批评指正。
<!-- CMA ID: 569917 --><!-- Site ID: 10 --><!-- XSLT stylesheet used to transform this file: dw-article-6.0-beta.xsl -->样例代码 | eclipse-system-class.rar | 38KB | HTTP |
学习
- 参考 Eclipse 官方网站首页,查看 Eclipse
相关技术的最新信息。
- 查看“Eclipse 帮助文档”,查看
Eclipse 中类的 API 定义以及其他的开发帮助文档。
- 查看网站“Eclipse
Source Analysis”,查看 Eclipse 的源码分析。
- 访问 developerWorks Open source 专区获得丰富的
how-to 信息、工具和项目更新以及最受欢迎的文章和教程,帮助您用开放源码技术进行开发,并将它们与
IBM 产品结合使用。
- 随时关注 developerWorks 技术活动和网络广播。
讨论
- 欢迎加入 My
developerWorks 中文社区。
注释 |
Eclipse 提供了 RCP 应用开发的内核,本身已经提供了许多有用的类,熟悉并且使用这些类,不仅可以减少代码量的开发,还可以提高代码的健壮性。既然 RCP 运行于 Eclipse 内核之上,就应该尽量多的使用系统自带的类。如 SafeRunner 提供了异常记入日志的功能、BusyIndicator 可以屏蔽鼠标事件,使得当前程序专注于处理一件事,而不使程序出现死的状态,鼠标变为漏斗状。本文尽可能详细的介绍这些类,用示例代码展示它们的用法,相信读者可以从本文掌握它们的使用技巧。 |
发表评论
-
离线使用tycho对eclipse RCP打包导出
2015-09-02 09:22 1227http://www.bubuko.com/infodetai ... -
RAP源码泛读及分析
2014-01-17 13:27 1139SWT、RWT如何保证大部 ... -
rap 的学习1
2013-10-27 22:02 776RAP 2.2 December 2013 (planne ... -
tycho 打包不同平台的RCP
2013-06-18 10:56 1142<configuration> < ... -
rap web开发
2013-04-10 17:12 887rap项目已经2.0(changelog) 这次改动 ... -
subversion升级到1.7
2012-09-07 15:37 1912http://www.cnblogs.com/xiziy ... -
ubuntu eclipse 中使用jadclipse java反编译
2012-09-07 11:04 11871:net.sf.jadclipse_3.3.0.jar 发 ... -
Nebula Project
2012-08-10 02:42 875http://www.eclipse.org/nebula/ -
Eclipse Plug-in dependencies – Required Bundle vrs. Import-Package
2012-07-19 00:32 3017http://www.vogella.com/blog/200 ... -
rcp培训
2012-07-19 00:22 1233<!-- @pa ... -
No schema found for … extension point 问题
2012-03-13 13:09 1576很多时候在编辑plugin.xml 文件的Extensi ... -
Eclipse中的org.eclipse.core.resources.markers扩展点
2011-11-09 11:26 1930扩展点配置如下:<extension ... -
开发一个调试 JSP 的 Eclipse 插件
2011-10-27 22:34 1565AVA调试框架(JPDA)简介JPDA是一个多层的调试框架 ... -
gmf 优点
2011-09-28 15:09 966http://www.ibm.com/developerwor ... -
gef 与gmf的结合
2011-09-28 14:03 1017以前的项目已经就是直接用gef,自己写模型的。 今天研 ... -
rcp自动加载插件
2011-09-28 13:56 1196http://blog.ixpub.net/html/9 ... -
rcp DialogSettings IPreferenceStore IMemento
2011-09-22 14:31 1131三个不的不同点: IMemento 要求rc ... -
rcp IPreferenceStore
2011-09-22 14:21 1260IPreferenceStore store=Acti ... -
rcp DialogSettings
2011-09-22 14:10 1164Activator.getDefault().getDialo ... -
rcp IMemento 状态的保存
2011-09-22 13:50 1124rcp 可以对每个part进行状态的保存。 保存数据 ...
相关推荐
RCP应用程序通常被打包成一个可执行的JAR文件(RCP应用程序),或者使用p2(Pulse)更新机制分发,用户可以通过安装向导来安装和升级应用程序,这使得软件的部署和更新更加便捷。 总结来说,RCP是一种强大的开发...
由于是基于Java构建,RCP应用能在Java EE环境中运行,同时具备B/S系统的部署便捷性和C/S系统的用户界面丰富性。它允许开发人员专注于核心功能的编写,因为RCP已经提供了大约80%的基础框架代码。RCP还支持跨平台迁移...
RCP为开发者提供了丰富的UI组件和事件处理机制,使得创建复杂的用户界面变得更加便捷。通过Eclipse插件开发,可以将不同的功能模块以插件的形式集成到主应用程序中,增强了系统的可扩展性和灵活性。 EMF是Eclipse...
Eclipse RCP利用Eclipse IDE的强大功能,使得开发过程更加高效和便捷。 在Eclipse RCP开发中,你需要了解以下关键知识点: 1. **MVC模式**:Eclipse RCP遵循Model-View-Controller设计模式,这有助于分离业务逻辑...
标签"eclipse rcp plugin"强调了Eclipse RCP的插件特性,表明这个资源可能是一个用于增强Eclipse RCP应用程序功能的插件,例如提供了更便捷的数据操作工具或者特定领域的应用支持。 至于"genius"这个压缩包子文件的...
### 实现RCP在线升级说明 ...这不仅提高了软件维护的效率,还为用户提供了一种便捷的更新方式。未来还可以进一步扩展在线升级的功能,比如增加自动检查更新机制或优化用户界面,以提供更好的用户体验。
在实际操作中,用户可以通过Web端在任何有网络的设备上进行图书查询、预约、续借等操作,而RCP客户端则为用户提供更深度的功能,如批量导入导出数据、自定义报告等。系统演示视频"程序演示屏幕录像.avi"可以帮助用户...
9. **调试和测试**:Eclipse提供了强大的调试器和测试框架,如JUnit,使得插件开发更加便捷。 10. **发布和部署**:了解如何打包和发布Eclipse插件,包括创建更新站点和生成可执行的RCP应用。 掌握以上知识点,并...
5. **命令(Command)与 Handler**:RCP中的操作都以命令形式存在,Handler负责执行命令,通过菜单、工具栏等方式触发。 **四、RCP应用的构建流程** 1. **定义插件结构**:包括插件元数据(plugin.xml)、类、资源...
这些UI元素可以通过命令(Commands)和快捷键(Key Bindings)进行配置,使得用户操作更加便捷。 7. **国际化和本地化(i18n)** Eclipse RCP支持多语言环境,开发者可以通过提供不同语言的资源文件来实现应用的...
4. **事件机制**:RCP内建的事件发布和订阅系统,使得组件间通信更为便捷,增强了系统的灵活性。 5. **服务(Service)**:RCP提供了一系列的服务接口,如国际化服务、偏好设置服务等,方便开发者进行功能实现。 *...
通过插件系统,RCP支持模块化开发,使得大型应用程序的维护和扩展变得更为便捷。透视图和视图机制则允许用户自定义工作环境,根据任务需求组织和显示不同的组件。 SWT和RCP结合使用时,开发者可以利用SWT的高效GUI...
7. **命令(Command)与快捷键**:Eclipse RCP使用命令系统来处理用户操作,可以绑定到菜单项、按钮或快捷键上。 8. **服务(Service)**:提供一种共享功能的方式,不同插件可以通过服务接口进行通信。 9. **运行...
7. **命令系统(Command System)**:Eclipse RCP提供了一个强大的命令系统,允许开发者定义、映射和执行应用程序中的操作。这些命令可以绑定到菜单、工具栏按钮或其他UI元素上。 8. **服务(Service)**:服务是...
本系统采用Eclipse RCP提供的组件和布局工具,打造了一个直观、简洁且操作便捷的用户界面。用户可以通过清晰的菜单和工具栏快速访问各项功能,如查询交通法规、处理违章信息、统计分析等。同时,系统采用了响应式...
Eclipse RCP利用SWT作为其底层的GUI库,使得应用程序具有与操作系统紧密集成的外观和行为。 2. **JFace**:JFace是Eclipse平台的一部分,建立在SWT之上,提供了一层抽象,简化了GUI编程。它包含了一些高级控件、...
标签“activemq rcp 例程”进一步确认了这个项目是关于ActiveMQ RCP的实践示例,可能包含了一些基本的操作如连接到ActiveMQ服务器、创建消费者和生产者、发送和接收消息以及处理RPC请求和响应的代码。 至于压缩包中...
在压缩包文件"存储过程.chm"中,可能包含了关于数据库存储过程的详细信息,这在RCP应用中也很常见,因为许多业务逻辑可能涉及数据库操作。存储过程是预编译的SQL代码集合,它可以提高性能,减少网络流量,并提供安全...
本篇文章将详细探讨一个使用Eclipse Rich Client Platform (RCP) 和 SWT 技术构建的学生成绩管理系统,帮助读者理解如何利用这些工具进行高效、便捷的软件开发。 Eclipse RCP(富客户端平台)是一个强大的框架,...