Consumer JRE
Java SE 6 Update N, 通常称作 Consumer JRE, 是 Sun 公司的努力成果,为重新配置 Java 将其作为开发富桌面应用程序的可行方法。在 Consumer JRE 中的新功能和主要改进列表相当广泛,并将特别闪耀的宝石隐藏在最新一周构建代码之一的发行说明中。Bug 6633275 被简单地赋予“需要支持不规则/透明窗口”的标题。但是该实现核心 JDK 新功能的可能性所带给 Swing 开发人员的意义是深远的。本文的剩余部分将显示能够实现和如何实现该功能的几个示例。
在进一步研究之前,有一个非常重要的注意事项。由于 Consumer JRE 被官方认为是对稳定 JDK 发行的一个次要更新,因此在“公共”包中不能添加任何新的 API( 类、方法等等 ),例如 java.awt 或 javax.swing。在本文中讨论的所有 API 在新 com.sun.awt.AWTUtilities 类中出现,该类不是官方支持的部分 API。它在 Java SE 7 中的位置最有可能发生改变,签名方法可能在现在和最终的 Consumer JRE 发行之间发生轻微变化。所以当这种改变发生时准备更改您自己的代码。
AWTUtilities 类
我首先讨论 com.sun.awt.AWTUtilities 类,请参见 在核心 Java 中的透明和不规则窗口 博客条目。首先我们从图 1 中的简单窗口入手:
图 1. 带有控件的窗口
要使窗口透明,您可以使用 AWTUtilities.setWindowOpacity(Window, float) 方法,如图 2 所示:
图 2. 相同的窗口,但是有 50% 的不透明度
要使窗口不规则,您可以使用 AWTUtilities.setWindowShape(Window, Shape) 方法,如图 3 所示:
图 3. 相同的窗口,但是被一个椭圆剪裁
正如您从图 3 中能看到的,不规则的窗口看起来不是很好。窗口的边缘呈锯齿状并且整体印象也不是很干净。要获得不规则窗口的更佳视觉效果,您必须使用 AWTUtilities.setWindowOpaque(Window, boolean) API,并使用柔性裁剪绘画窗口背景。这在后续的 Swing 窗口的柔性裁剪和每像素透明度 博客条目中进行了阐明。对于窗口的左上角和右上角,该条目采用 Chris Campbell 的 柔性裁剪教程 以及 Romain Guy 的 反射教程, 其中包括 Sebastien Petrucci 的改进。图 4 显示了每个像素透明的柔性裁剪窗口:
图 4. 柔性裁剪和每个像素透明的窗口
现在我们手头上已经有了这些 API,我们打算做些什么呢?对它们进行探索这种可能性当然是另人好奇的,我们正打算看看几个多样混合的示例。