浅谈Swing支持透明和不规则窗口

开发 后端
本文介绍Swing支持透明和不规则窗口,如果在特定目标平台不支持此项功能,那么在该平台上就没有什么更多事情要做了。

让Swing支持透明和不规则窗口已经成为 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.

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 类,请参见Swing支持透明和不规则窗口 博客条目。

不规则的窗口看起来不是很好。窗口的边缘呈锯齿状并且整体印象也不是很干净。要获得不规则窗口的更佳视觉效果,您必须使用 AWTUtilities.setWindowOpaque(Window, boolean) API,并使用柔性裁剪绘画窗口背景。这在后续的 Swing 窗口的柔性裁剪和每像素透明度 博客条目中进行了阐明。对于窗口的左上角和右上角,该条目采用 Chris Campbell 的 柔性裁剪教程 以及 Romain Guy 的 反射教程, 其中包括 Sebastien Petrucci 的改进。

现在我们手头上已经有了这些 API,我们打算做些什么呢?对它们进行探索这种可能性当然是另人好奇的,我们正打算看看几个多样混合的示例。

工具提示让我们使应用工具提示变得透明怎么样?对于轻量级工具提示,实现这一目标是相当容易的,因为它们被作为 Swing ***窗口的一部分加以绘画。( 要获得关于轻量级弹出菜单的详细信息,请参见 玻璃窗格和轻量级弹出菜单条目。)但是,一旦工具提示成为重量级并“打破”窗口绑定,您必须继续采用 Robot 或 JNI/JNA.现在让我们看一看使用 AWTUtilities API 如何完成这项任务。

【编辑推荐】

  1. Swing应用的数据验证
  2. 浅谈Swing和SWT比较
  3. 应该改进的Java Swing 2.0
  4. 浅析Swing Set示例
  5. Swing中的JFormattedTextField组件实例
责任编辑:佚名 来源: 中国IT实验室
相关推荐

2009-12-25 10:20:28

WPF窗口

2009-07-10 17:20:38

Swing构件AWT构件

2009-07-10 11:07:18

Swing和SWT

2015-07-17 13:31:20

按钮单独控制

2009-07-16 16:01:55

EventQueue

2009-07-14 18:28:58

Swing入门

2009-07-15 13:06:38

Swing组件

2009-07-15 14:29:24

构造JListSwing

2009-07-16 12:58:50

Swing控件

2009-07-17 12:44:01

NetBeans开发S

2011-06-20 17:06:56

Qt Widget

2010-09-08 17:20:42

CSS

2009-07-15 11:02:32

Swing组件

2009-07-17 16:49:18

lookandfeelSwing

2009-07-10 13:09:53

.Net与Java S

2009-07-16 16:23:59

Swing线程

2009-07-15 09:59:11

Metal观感Swing

2009-07-14 14:50:00

JOptionPane

2010-09-14 10:34:17

DIV CSS

2009-07-14 11:08:42

WebRendererSwing应用程序
点赞
收藏

51CTO技术栈公众号