Java 6 和 Java 7 中的客户端改进

作者:Josh Marinacci

了解有关 Java SE 6 和 Java SE 7 的客户端和桌面部件的改进,包括新的小程序插件、Java Deployment Toolkit、异形和半透明窗口、重量级和轻量级控件混合以及 Java Web Start。

2011 年 9 月发布

下载:
下载Java SE 6

下载Java SE 7

简介

自 2006 年 12 月 Java Platform Standard Edition 6 (Java SE 6) 发布以来,已对 Java 客户端和桌面部件进行了许多改进。在本文中,我们将了解一下 Swing,然后深入介绍让开发人员能够开发出非常棒的客户端应用程序的一些支持技术,如安装、Java Web Start、小程序和图形改进。然后我们将看看 Java 7。

Java SE 6 中的 Swing 改进

Java SE 6 为 Swing 增加了几个新的 API。拖放 API 扩展了 TransferSupport 类,这大大方便了在 Swing 应用程序中实现拖放支持,并为开发人员提供了在控件中内置实时反馈的机会。部分 Swing 教程介绍了如何使用该类。

尽管 Java SE 6 未引入任何新的 Swing 控件,但它通过添加一个用于排序和筛选表内容的 API 显著改进了 JTable 控件。此 API 允许您按列对表进行排序或使用文本搜索筛选表中的数据,它还允许您为自己的数据类型创建自定义排序器和筛选器。Swing 教程介绍了如何使用 Java SE 6 中添加的 JTable 排序和筛选 API。

快速响应能力始终是一个好的客户端应用程序的重要特性。设计良好的应用程序应将所有重量级工作推入后台线程。不过,如何将线程与 Swing 事件和绘制机制同步始终并非易事。Java SE 6 引入了 SwingWorker 实用程序类,大大简化了后台任务的处理。SwingWorker 生成一个后台线程,然后允许您安全地通过 Swing 事件线程向 UI 提供进度反馈。

图形改进

尽管自发布 Java SE 6 以来,Oracle 尚未发布任何新的公共 Swing API,但内里进行了许多工作来使 Swing 更快速、更高效。首先来看图形层。
首先,Oracle 的客户端团队通过默认启用 Direct3D 和 OpenGL 管道提高了绘制速度。这意味着每当您在屏幕上绘制某物时,操作系统可以使用图形卡中可用的硬件加速提高绘制速度。

以前,只有诸如绘制直线和矩形的函数才可以加速。然而现在,大多数计算机本身带有可加速更复杂绘制函数的可编程 GPU。如果您在最新的 Microsoft Windows 计算机上安装了 Java SE 6 的最新更新,可以使 BufferedImageOps 加速十倍。这意味着您可以实时应用诸如模糊、阴影和饱和度调整等效果。使用新的 OpenGL 和 Direct3D 管道,您可以开发闪电般快速的应用程序,100% 采用 Java。

在使用硬件加速的同时,Swing 团队还通过使用后端缓冲区改进了屏幕上图形的绘制方式。这意味着应用程序首先绘制到主内存块,接着瞬间之后绘制到实际屏幕。这种新的策略有两个优点。第一,因为操作系统本身可以调度进行屏幕绘制,动画可以非常平滑,没有撕裂。第二,如果由于某种原因应用程序变慢,在计算机等待应用程序响应时不会在屏幕上留下一大片灰色区域。这种所谓的“灰色矩形”问题现在已不复存在。

Abstract Windowing Toolkit (AWT) 的 Frame 和 Window 类

您可能会认为 AWT 已经寿终正寝了,但它实际上有两个部分,其中一个仍很有用。其 UI 小工具(按钮、滑块等等)不再建议使用。但是 AWT 还包括顶级 Frame 和 Window 类。Oracle 添加了一个重要的非公开 API:异形和半透明窗口。

2005 年,我与人合著了《Swing Hacks》一书,介绍了如何对 Swing 进行改编以完成各种任务。其中一个最受欢迎的改编是一个用于仿造异形和半透明窗口的方法。如今我们不再需要仿造它。现在开发人员可以使用 com.sun.awt.AWTUtilities 类创建一个带任意窗口形状的应用程序。

这个类允许您使用剪辑形状、透明度值、甚至用于逐像素透明度的全 alpha 遮罩来配置窗口。以下代码将窗口的透明度设置为 50%:

 com.sun.awt.AWTUtilities.setWindowOpacity(window, 0.5);


对于 Java SE 7,该 API 是公开的。除了对异形窗口的支持,AWT 现在还允许混合轻量级和重量级控件。Swing 控件是轻量级的,意味着它们只是通过普通图形调用绘制到屏幕。其他 AWT 组件则是重量级的,这意味着它们使用特殊的操作系统调用绘制到屏幕。
一直以来,混合轻量级和重量级控件总是漏洞百出、容易出错,给任何打算在应用程序中嵌入第三方原生控件(如 Web 浏览器或 OpenGL 3D 画布)的人带来麻烦。Java SE 6 update 12 引入了无缝混合重量级和轻量级控件的功能。对于大部分情况,您无需执行任何新的操作;它自己就可以工作。

外观

Java SE 6 包括了许多改进窗口外观的工作。起初,此外观模拟标准 Microsoft Windows 控件。在 Java 2 Platform Standard Edition 5.0 (J2SE 5.0) 中,窗口外观开始使用 Microsoft Windows XP 的原生主题引擎,以确保即使用户切换到自定义主题,Swing 控件仍与其原生对应物的外观类似。自 Java SE 6 发布以来,Swing 团队一直在持续改进窗口外观以支持 Microsoft Windows Vista 和 Microsoft Windows 7,包括可聚焦元素上优美、细腻的动画。

J2SE 5.0 引入了一个名为 Synth 的可换肤的新外观,它在 Java SE 6 中得到了极大改进。自 Java SE 6 起,Swing 团队进一步改进了 Synth,他们还创建了一个名为 Nimbus 的全新外观。Nimbus 由天才的 Oracle 工程师 Jasper Potts 构建,它是一个现代的跨平台外观,带有圆形缘边、梯度填充和细微阴影。有了 Nimbus,没有理由再用 Metal。

安装和启动

几年前,Java 团队发起了一个名为 Java SE 6 Update N 的行动,目的是解决更快地安装、更新和启动 Java 所涉及的许多问题。这一行动导致了更好的 Java 用户初始体验。

首先,Java 部署团队创建了一个名为 Java Deployment Toolkit 的工具。此工具包是一些检测脚本和浏览器内安装程序的集合,用于确保用户已安装 Java 以便快速启动应用程序。作为开发人员,您只需要将一个特殊 JavaScript 文件包含在 Web 页面中,然后调用 deployJava 对象上的一个函数。

以下示例包含该 deployJava.js 文件,该文件然后启动一个小程序。该工具包检测已安装的(如果有的话)Java 版本,启动新的安装程序(如果需要),然后启动应用程序。

  <script src="http://www.java.com/js/deployJava.js"></script>
  <script>
   var attributes = {codebase:'http://java.sun.com/products/plugin/1.5.0/demos/jfc/Java2D',
                        code:'java2d.Java2DemoApplet.class',
                        archive:'Java2Demo.jar',
                        width:710, height:540} ;
      var parameters = {fontSize:16} ;
      var version = '1.6' ;
      deployJava.runApplet(attributes, parameters, version);
   </script>

除了 Java Deployment Toolkit 本身,Java 团队还改进了 Microsoft Windows 安装程序以提高它的启动速度、减少下载和单击次数。他们还引入了一项称为 Java Kernel 的技术,它会下载让应用程序运行所需要的部分 Java Runtime Environment (JRE),然后在后台安装其余部分。

Microsoft Windows 上还提供了一个新的名为 Java Quick Starter 的后台进程,它包括一个可以在 Microsoft Windows XP 上预先下载部分 Java(最多仅 20 MB)的小系统服务。

Java Web Start

在用户的计算机上安装并运行 Java 之后,有两种方式来启动应用程序。如果您希望使用桌面图标在浏览器之外运行应用程序,则应使用 Java Web Start。Java Web Start 大约在十年前引入,至今已经历了长时间的发展。Java SE 6 添加了对闪屏、PNG 格式图标和更好的更新控制的支持。

Java Web Start 允许您使用一种称为 Pack200 的特殊形式的压缩。它通过删除同一 JAR 文件内各类之间共享的冗余信息来压缩 Java 字节码。与 GZip 结合时,Pack200 可以产生 5 至 10 倍的压缩比,这可以让启动时间产生巨大的差异。

开发人员原来不得不使用一个特殊 servlet 或重新配置 Web 服务器以支持 Pack200 下载,但现在不再是这种情况了。Java Web Start 现在会自动检测 Web 服务器上的 Pack200 文件并下载任何可用的这些文件,如果未找到 Pack200 文件,则转而使用常规 JAR 文件。

除了一些错误修复和速度改进之外,部署团队还为 Java Web Start 添加了一些新的 API。现在开发人员可以使用 DownloadServiceListener API 并在应用程序中指定一个特定 JAR 文件作为下载指示器来为应用程序创建自定义加载进度条。使用此新特性,开发人员可以创建一个实际与其应用程序相关的加载动画,而不是使用通用进度条。

除了 DownloadServiceListener 之外,还有新的 DownloadService2 和 IntegrationService。DownloadService2 允许您查询 Java Web Start 缓存以查看应用程序中已经安装的资源和 JAR 文件,并检查 Web 服务器上的可用更新。IntegrationService API 允许您创建和删除桌面和系统菜单上的快捷方式,以及编辑应用程序的系统范围的 MIME 类型关联。

小程序

Java Web Start 并不是唯一得到大幅改进的应用程序类型。小程序也进行了大量改进。第一个重要更改是从头重新编写了小程序浏览器插件。现在小程序是在进程外运行,这意味着它们独立于浏览器,因此浏览器不可能被流氓小程序锁定或弄崩溃。这也让小程序更加安全。

结合新插件的基本安全性,小程序现在可以使用全部 Java Web Start API 安全地访问本地文件和存储、打印、访问剪贴板以及访问 Java Web Start 缓存。重新编写的插件还有一个新的 Java 到 JavaScript 桥,允许您在 Web 页面中调用 JavaScript 函数,反之亦然。有些开发人员已使用此插件为其 Web 应用程序添加文件上传和本地存储支持。小程序也可以创建自定义加载屏幕而不是使用默认 Java 微调控件。

扩展的小程序 Java Web Start 安全模型包括对 crossdomain.xml 文件的支持。通常,未签名的小程序无法突破沙盒去打开与其他网站的 HTTP 连接。不过,有时您希望允许这样,例如当您构建来自第三方(如 Flickr、Google 或 Twitter)的 Web 服务混搭时。为支持这种情况,Java 现在可以处理 crossdomain.xml 文件。Web 服务的所有者将此类型的小文件放在网站上。如果小程序尝试连接外部 Web 服务,该插件首先在站点上查找 crossdomain.xml 文件,看是否允许打开特殊连接。Flash 和 Silverlight 都支持 crossdomain.xml 文件,现在 Java 小程序也支持它。

新的浏览器插件使许多新事物成为可能。进程外运行的新插件的一个有趣的附带效果是,您可以实际上将正在运行的小程序从 Web 浏览器拖到桌面上。因此,小程序不再受 Web 页面边界的约束,如图 1 所示。


javaclient 1

图 1. 小程序不再是只能在浏览器内部运行

Mac OS X 改进

不仅桌面上的 Java 普遍得到改进,而且 Apple 的 Java 团队还进行了许多专门针对 Mac 的改进。Mac Aqua 外观提供了 UI 控件的一些变体,它们的行为方式与常规控件相同,只是外观稍有不同。例如,工具栏上的一组按钮可能有圆角,以将它们组合在一起。有些控件有一个特殊的微型版本用于浮动面板。您只需在 Swing 小工具上设置几个客户端属性,即可在 Java 应用程序中使用控件变体。以下是一个使用客户端属性将常规按钮转换成纹理按钮的示例:

 jbutton.putClientProperty("JButton.buttonType", "textured");
 

javaclient 2
图 2. 转换之前的矩形按钮

javaclient 3
图 3. 转换之后的矩形按钮

除了控件变体之外,Apple 团队将大多数 Java SE 6 更新特性移植到 Mac 的最新 Java 版本,包括新的小程序插件。现在任何装有 Snow Leopard 的 Mac 都有一个与最新 Microsoft Windows JRE 特性兼容的一版 Java。

更令人兴奋的是,Apple 宣布他们要将其代码贡献给 OpenJDK 项目。将来,Mac JRE 不再是一个特殊的 Apple 版本,而将是 Oracle 直接支持的另一个 OpenJDK 平台。这意味着 Mac 用户将直接从源头获得与所有其他人相同的 Java 版本。最近公布了 OpenJDK 的 Aqua 外观的一个早期 alpha 版本。如果您对改编新 Mac JRE 感兴趣,请看看该文。

 

Java SE 7

Java SE 7 的发布带来了更多的改进。首先,Mac OS 和 Microsoft Windows 所享用的极棒的硬件加速现在将以 XRender 改进的形式可用于 Linux 上。Oracle 还将提供 Java SE 6 更新中引入的异形和半透明窗口 API 的最终正式版本。Swing 不久获得了它的第一个新组件 JLayer,该组件允许您将转换和特殊效果与常规 Swing 控件无缝混合。

最后,桌面 Java 应用程序受益于 Java SE 7 中的许多常规改进。改进的文件 I/O API 提供了对文件权限、符号链接和文件更改通知的细粒度的控制,以及让操作系统能够以原生速度移动和复制文件的能力。

随着 Java SE 7 中的改进和今年夏天推出的 JavaFX 的新的 Java 语言版本,客户端 Java 的前途一片光明。

另请参见

关于作者

Josh Marinacci 长期为无线、Web 和桌面平台编写基于 Java 技术的用户界面 (UI)。他曾任职于 Xerox Parc 和 Sun Microsystems。他目前就职于 Palm,作为开发提倡者,帮助开发人员为 Palm 的 webOS 电话创建应用程序。他与 Chris Adamson 合著了《Swing Hacks》。