实例详解NetBeans和Swing平台开发

星月高悬 2009-06-15

笔者和很早就开始使用 Java 的大多数人一样,我最初接触这项技术是使用(小型)桌面应用程序的时候:它们是我读博士期间的一些研究素材和一个卫生保健呼叫中心的简单控制面板。那时是 AWT 时代,能做的事有限。因此我很快就转到了服务器这边,这边的系统似乎更强健、更有发展。事实确实如此。我在这次领域工作了很长时间,并且成为一名 J2EE 架构师。

几年之后,由于对数字摄影热情的不断高涨,我又重新被吸引到桌面。我仍然遇到了许多问题,但是就在我即将放弃的时候,Sun 和开发人员社区推出的 SwingLabs、java.net 和新版本的 NetBeans 把我从困难中解救出来。现在,我正在热衷于使用一个(可能是)富有前途的开放源码应用程序 blueMarine,这个程序基于 NetBeans 平台。

在本文中,我将告诉您有关 blueMarine 的更多故事,并且回顾一些主要的 NetBeans 扩展 API。我将介绍如何使用和自定义这些 API,同时指出我曾经面临的问题以及解决这些问题的方法。如果您对NetBeans和Swing知之甚少,而您又需要接触各种各样的客户端应用程序,我认为您应该好好阅读这篇文章。

开始

2001 年前后,由于厌倦了使用 OpenOffice 电子表格,我第一次编写了一些 Java 代码,用于管理我的照片。我将所有内容导出到 XML 并且利用 XSLT 转换,确定了我自己的数据库格式,通过基于 Swing 的一个非常简单的图形用户界面进行管理。

在 2003 年夏天,我在数码相机世界有了较大的飞跃,购买了 Nikon D100(专业的 SLR)。那个夏天是意大利本世纪最炎热的夏天,因此我不得不最大程度地减少拍照旅行的数量:外出散步也是受罪。我不得不待在家里,尽管托斯卡纳乡村的环境能令人放松,因此,大部分假期我都在学习 NEF 格式。

当时,NEF 是一种“原始数据文件格式”,并且几乎没有公开。原始数据文件格式包含的数据直接来自于相机 CCD 传感器,未经过处理。如果要将它转换为质量比较好的图片,还需要对数据进行处理。这通常认为这一过程是旧式潮湿暗室相片成像的数字过程。我从来没有拥有过自己的潮湿暗室,我为“数字冲洗”照片而入迷,开始为此编写了一些 Java 代码。

夏天快结束的时候,我创建了一个简单的能够显示照片的微型导航程序―― blueMarine 就此诞生了。一年之后,这个项目便能够用编录设备标记照片,并且能够在网上发布图片库。

但是,让我非常苦恼的是,我需要多个软件来执行编辑、打印、编录、归档以及 Web 发布任务。因此我着手开始研究在一个应用程序中实现所有这些工作流程。同时,我认为是时候公开发布 blueMarine 了,因此第一个 alpha 版本发布到了 GPL License(后来更改为 Apache 2.0)支持下的 SourceForge 。

另一个推动力是在台式计算机上挑战使用 Java 对数字图像进行处理。对于我来说,Java 在科学图像处理方面的优势已经非常明显;例如, NASA 的工程师们已经成功使用了 JAI,它是一种高级成像的 API。但是,对于普通摄影师来说,桌面处理包含哪些内容呢?自从成为 Java 顾问 10 多年来,证明 Java 在各种各样的应用程序方面的优势一直是我追求的目标。

挫折

虽然开始时热情高涨,但是在 2005 年底,我在这个项目上受到了很大的打击。性能不是大问题,但是,在使用 plain Swing 开发丰富的 GUI 应用程序时,我遇到了困难。Swing 是一个非常出色的 API,但是当您使用它构建复杂的应用程序时,您会发现仍然需要增加很多功能。

实现这些缺少的部分并不是前言科学,但是这项工作浪费了很多宝贵的时间。再次举例来说明这个问题,例如构建菜单、以上下文相关的方式启用操作、为内部窗口定义灵活的、可在工作时停靠的机制等等,并且您将发现自己的大部分时间都花费在编写通用的 GUI 组件上,而没有花费在应用程序的核心内容上。

直到最近,才有了几个处理此类问题的开放源码库,但是大部分库都不太令人满意,而且也很难集成。还有几个较早版本的 NetBeans,但是我不满意它们的性能。也可以选择 Eclipse 和 SWT,但是我觉得我并没有真正地仔细研究完全的替代方法和非标准的 API,我采用的学习投资回报低,继承 Swing的方法比较麻烦。

总的来讲,我认真地考虑过放弃 blueMarine C 或许 Java 尚未准备用于桌面开发。

新生

但是,同时出现了两个事件使这个项目得以保留下来,这两个事件是,我在 2005 年底参与了 JavaPolis 以及 2006 年初发布了 NetBeans 5.0。

在 JavaPolis,我呼吸到了我几乎都快忘记的社区空气(自从我上次参加JavaOne 已经过去了三年)。这重新点燃了我的热情,Romain Guy 的演示说明了使用 Swing 构建 GUI 的效果如何,,这使我兴趣倍增。我开始查看 Romain 的博客,并按照下面的链接访问了其他人的博客,如 Joshua Marinacci 的博客,然后再从那里访问所有 java.net 和 JavaDesktop 的站点。我发现 Swing 里面有很多新鲜有趣的事;像 SwingLabs 里质量优良的 Swing组件和出众的演示程序 C 很多材料我都能够使用。但是,我仍然需要一个平台。

几周之后,推出了NetBeans 5.0 。这个新的版本看起来似乎最终解决了传统的平台问题,因此我决定试一试。我开始分解 blueMarine,只提取成像代码并对该代码重新设计以便使用 NetBeans 平台。几个月之后,便可以发布了第一个 Early Access 版本,我开始使用这个工具管理我自己的照片。同时,从前一个 PPC Apple iBook 切换到新的 Intel MacBook Pro 没有出现任何问题则强有力地表明了我的选择是正确的。

目前,我正致力于使新的 blueMarine 更稳定、更便于使用。获得了新的 early access 版本,并且我正在进行所需的质量测试(整个新设计明显破坏了以前版本的一些稳定性;这就是付出的代价)。

NetBeans和Swing平台的功能

由于您已经了解了 blueMarine 的由来,因此我将概述一些NetBeans和Swing带来的开发优势、我曾经面临的问题以及解决这些问题的方法。

第一点:是 Swing!

对于我来说,与很多竞争对手(如 Eclipse RCP)相比,NetBeans 平台基于常规的Swing 是一个巨大的优势。搜索一下,您会发现 Swing 组件(包括实现动画和效果比较酷的组件)有更广阔的选择余地。

去年 6 月份我非常具体地认识到了这个优势,当时 Joshua Marinacci 发布了能够显示地图的 Aerith Swing 组件的源代码,命名为 JXMapViewer(Aerith 是 2006 年 JavaOne 上最热门的演示程序)。几周以来,我一直都在等待这个时刻,blueMarine 的其中一个功能是地理标记(将地理位置与每个照片相关联,以便这些照片可以显示在地图上)。将 JXMapViewer 集成到 blueMarine 中只需要几个小时;

模块系统

当然,NetBeans 平台应用程序自然分为几个模块,实际上,它是一组绑定在一起的模块。每个模块都有一个名称、一组版本标记及其自己的类路径以及一个声明的依赖关系的列表。开 发人员可以控制哪些公共类的子集向其他模块公开,其他模块可以看到哪些公共类的子集,平台可以在模块之间施加依赖关系(例如,如果所需的模块都不存在或者 太旧,则阻止模块安装)。

此外,通过发布新的模块(放在 nbm 文件中)可以在以后扩展应用程序,用户可以建立他们自己的“更新中心”,以便从 Internet 下载更新。可以对各个模块进行数字签名,系统会自动弹出他们的许可证以便进行批准(如果需要的话)。

BueMarine 项目充分利用这个组织。该应用程序的核心 API 由实现工作空间管理器、照片、缩略图管理、简单缩略图和照片查看器的相对比较小的模块集进行定义。更多的高级功能(如编录、图库管理器和地理标记功能,包括地图查看器)可以在单独并且几乎不相关的模块中实现,这些模块就作为核心 API 的“客户端”。

DataObject、Node 和 ExplorerManager

ExplorerManager、Node 和 DataObject 可能是 NetBeans 中最有用的 API。使用 DataObject,您可以实现特定于应用程序的实体,这些实体是映射到磁盘上的文件中。例如,blueMarine 的基本实体为 PhotoDataObject,它代表数据库中的照片。

相关推荐