Java 7中是否可以实现包括标题栏在内的半透明窗口?

7
与此问题相关的链接:Java教程半透明窗口示例是否会给那些在使用jdk7的人造成麻烦? 使用jdk1.6.0_26,我似乎可以将半透明效果应用到JFrame中,但在jre7中却不行:
NativeException:java.awt.IllegalComponentStateException:该窗口是装饰的
例如(使用jruby脚本编写java,在jdk1.6下工作,在jdk7下无法工作):
require 'java'
class MouseDraw
def self.go java_import 'javax.swing.JFrame' java_import 'com.sun.awt.AWTUtilities'
f = JFrame.new AWTUtilities.set_window_opacity(f, 0.5) f.set_size 200,200 f.show end
end MouseDraw.go
因此我的问题是“在jdk7中是否可能拥有半透明标题栏”(我希望创建的透明窗口可以拖动/调整大小)。
2个回答

8

Java 7引入了Window.setOpacity(),用于替代Java 6中非官方类AWTUtilities的功能。

不幸的是,文档指出这个方法不能与有装饰的窗口一起使用:

以下条件必须满足才能将透明度设置为小于1.0f的值:

(强调为本人添加)


@kleopatra:但这就是你使用非官方API时签署的协议。AWTUtilities在Java SE中未定义,而新方法不会破坏任何先前定义的公共方法的兼容性。 - Joachim Sauer
1
从技术上讲,你是正确的,但从技术上讲,我没有使用它,而是使用了AWTUtilitiesWrapper,这是一个即将推出功能的半官方预览版(并且被宣传为相当安全;-)。 - kleopatra
1
从教程过时的角度来看,这似乎是一个相当晚期的紧急制动器,用于修复装饰窗口中的某些狂野或不那么狂野的副作用(再见淡出;-)。 - kleopatra
所以我有一个使用半透明装饰窗口的Java 7程序(在Ubuntu上正常工作)。 然后在Windows上运行相同的程序不起作用。请解释一下。 - Joelle Boulet
@JoelBoulet:我不太清楚你的期望是什么。我认为你应该发布一个带有更多信息的问题。 - Joachim Sauer

3

有趣的是,如果你添加

JFrame.setDefaultLookAndFeelDecorated(true);

它允许您拥有一个可拖动的,带标题栏的JFrame(它只使用丑陋的Java外观)。

参考:将鼠标事件从Java UI传递到后面的应用程序

现在这很奇怪。

还要注意,您可以使用每像素透明度“伪造”旧行为,请参见http://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html

因此,您可以在Java 6和7中都具有旧行为,但您需要特别处理代码,并为其中之一执行一种方式,另一种方式执行另一种方式,可能会有这样的情况...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接