【IT168 技术文档】支持透明和不规则窗口已经成为 AWT 和 Swing 团队长久以来梦寐以求的功能。尽管本机应用程序在主要操作系统上使用这项功能已经为时已久,但在核心 Java 中还不能使用它。即将发布的 “Consumer JRE”正在进行修改,也就是对 Java SE 6 进行重大更新。Java SE 6 将为创建不规则、全透明和每个像素透明的优异窗口提供 API。
历史
本机应用程序的开发人员通常在开发 UI 应用程序中享受了更高级的灵活性。但是为此而付出的代价是将应用程序限制在某一特定平台上,在许多情况中,这种灵活性不如获得更为丰富的 UI 体验和桌面紧密集成那么重要。从传统上讲,跨平台 UI 工具箱,例如 Swing、SWT、QT 和 wxWidgets 趋向于被动应付众所周知的两难问题。当只有某些目标平台支持所要求的功能时怎么办?在这种情况下,模拟缺失的功能可能只会让您南辕北辙。
不规则和透明窗口是跨平台 UI 工具箱局限性的最好例子。如果在特定目标平台不支持此项功能,那么在该平台上就没有什么更多事情要做了,此项功能可能用作强有力的参数向工具箱添加该项功能。但是,Swing 开发人员社区长久以来一直争论主要目标平台不久就会提供这些功能。事实上,Windows 自从 Windows 95 ( 参见 MSDN 上的 SetWindowRgn 文档 )就已经支持不规则窗口了。在 X11 中匹配功能自从 1989 年 ( 参见 X Nonrectangular Window Shape Extension Library PDF 文档 )就已经可用了。在 OS X 中您仅能在 JFrame 上设置透明的背景颜色。
直到现在,对跨平台透明和不规则窗口有兴趣的 Swing 应用程序有三种主要可选方式。
在显示目标窗口之前使用 java.awt.Robot 捕获桌面。这种方法在 Joshua Marinacci 和 Chris Adamson 编写的 《 Swing Hacks 》 书中的 第 41 章 中已经进行了评述。
使用 JNI 包装目标平台的本机 API。
使用由 Timothy Wall 开发的 JNA 库。该库在 2007 年问世,Timothy 对于 不规则窗口 和 字母掩码透明度 已经发表过博客。
第一种方法的主要问题是要使用 Robot 类。即使您有权限获得屏幕截图,您也必须在显示窗口之前完成。此外,如何保持桌面后台同步?假设在后台正在播放 YouTube 视频。与窗口生成的事件不同( 调整大小,移动 ),AWT 并不在任何交叉窗口的重画上提供注册侦听器的任何方式。虽然 Chris 和 Joshua 通过在至少每秒内进行快照提供解决方法,这对于覆盖后台视频播放还不够。而且在每次快照前需要对窗口加以隐藏;这可能导致可见的闪烁。
使用 JNI 和 JNA 导致显著的视觉保真性改进。纯 JNI 会带来开销的急剧下降:您必须将目标平台的每一个相关的 API 绑定,还要捆绑本机库。JNA 为您分担这项重任; 它捆绑主机库并提供能在运行时提取并加载它们的类加载器。它支持 Linux、 OS X、 Windows、 Solaris 和 FreeBSD。