Java教程半透明窗口示例是否给那些使用jdk7的人带来了麻烦?
这是我的建议 如果在支持jdk7的NetBeans IDE 7.0中构建并运行Java教程半透明窗口示例是否给那些使用jdk7的人带来了麻烦?,java,swing,java-7,translucency,netbeans7.0,Java,Swing,Java 7,Translucency,Netbeans7.0,这是我的建议 如果在支持jdk7的NetBeans IDE 7.0中构建并运行半透明窗口,则会出现以下异常: Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: The frame is decorated at java.awt.Frame.setOpacity(Frame.java:960) at main.TranslucentWindow.<init>(
半透明窗口
,则会出现以下异常:
Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: The frame is decorated
at java.awt.Frame.setOpacity(Frame.java:960)
at main.TranslucentWindow.<init>(TranslucentWindow.java:23)
at main.TranslucentWindow$1.run(TranslucentWindow.java:47)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
BUILD SUCCESSFUL (total time: 1 second)
线程“AWT-EventQueue-0”java.AWT.IllegalComponentStateException中的异常:框架被修饰
位于java.awt.Frame.setOpacity(Frame.java:960)
在main.TranslucentWindow中。(TranslucentWindow.java:23)
在main.TranslucentWindow$1.run(TranslucentWindow.java:47)
在java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)中
位于java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
在java.awt.EventQueue.access$000(EventQueue.java:101)
在java.awt.EventQueue$3.run(EventQueue.java:666)
在java.awt.EventQueue$3.run(EventQueue.java:664)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
位于java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
位于java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
位于java.awt.EventDispatchThread.PumpeEventsforFilter(EventDispatchThread.java:128)
位于java.awt.EventDispatchThread.PumpeEventsforHierarchy(EventDispatchThread.java:117)
位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
在java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
生成成功(总时间:1秒)
根据这个堆栈跟踪,有问题的行是tw.setOpacity(0.55f)
。但是,正如错误所指出的,如果在框架上调用setUndercorated(true)
,那么它不会抛出异常,并将创建一个半透明窗口,尽管没有任何装饰(这很痛苦)。这正常吗?这段代码不应该“开箱即用”地运行吗?我是不是忽略了什么
编辑
为什么他们的半透明窗口看起来是装饰的,或者这是自定义渲染
它是什么…
应该是什么…
右起:
要将不透明度值设置为小于1.0f,必须满足以下条件:
- 基础系统必须支持半透明
- 窗口必须未装饰(请参见setUndecorated(布尔值)和Dialog.setUndecorated(布尔值))
- 窗口不得处于全屏模式(请参阅GraphicsDevice.setFullScreenWindow(窗口))
您看到的行为已记录在案,并且是预期的行为。这是一个已验证的错误。我已经向Oracle发送了关于使用JDK1.7.0或JRE7的默认安装失败的示例代码的信息。使用下面编译成TranslucentWindow.java的源代码,它会失败并产生上面最初指出的异常 从网页 }
在JDK 7中使用
com.sun.awt.AWTUtilities.setWindowOpacity(w,0.5f)
请参阅。您好,此代码的问题在于main()方法中缺少以下代码行: 它应该紧跟在检查半透明窗口是否不受支持并退出的代码之后:
//If translucent windows aren't supported, exit.
if (!gd.isWindowTranslucencySupported(TRANSLUCENT)) {
System.err.println(
"Translucency is not supported");
System.exit(0);
}
JFrame.setDefaultLookAndFeelDecorated(true);
// Create the GUI on the event-dispatching thread
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TranslucentWindow tw = new TranslucentWindow();
// Set the window to 55% opaque (45% translucent).
tw.setOpacity(0.55f);
// Display the window.
tw.setVisible(true);
}
});
此外,统一半透明图像的图像具有误导性,因为它使用java外观。相反,映像应该使用Windows系统的外观(假设您在Windows上)。如果您尝试使用Java外观(即,
JFrame.setDefaultLookAndFeelDecorated(false);
),那么它将抛出与以前相同的错误。我希望半透明窗口能与Java的外观配合使用,但我认为这是不可能的。我认为你需要在遇到挫折之前进行装饰,这将解决问题。@Thomas,doh!:(…嗯,很高兴它在Javadoc中!:)不幸的是,我对JDK7的经验很少。我只是因为NetBeans 7支持它才开始研究它。“我花了大约20分钟到处闲逛。”托马斯也是这样。这恰好是我最先关注的项目之一。感谢迄今为止的帮助。:)我能想到的只有三件事:(1)这是一家“商店”;(2)出于某种原因,对未装饰窗户的限制并不总是存在,这是在这之前就被捕捉到的;或者(3)你可以在使窗户半透明后,将装饰后的窗户放回原处。但我不会在任何一个上面赌任何钱……我希望我能帮上更多的忙。@Thomas,我的第一个猜测是(1),但是(2)听起来也很合理哈哈……不幸的是他们在做虚假广告……:/对我来说,未修饰的windows吸引力要小得多。同样的错误:NetBeans 7、Java 7、windows 7:777看起来教程已经过时了……错误报告在哪里,其他人可以看到?我注意到,对于jre6,我“有时”会遇到这种异常,而其他时候它会显示完整的JFrame半透明(正如他的“应该”示例所做的那样)。似乎暗示这是jdk6中允许的一个“错误”,因为这也不是他们错误报告系统中的正式错误报告,而是给文档页面维护人员的一封关于该页面有错误代码的电子邮件。我从未收到过他们的回信,但邮件发到了“javasedocs”_us@oracle.com没有官方的错误报告,但你称之为已验证的错误??是的。它是可复制的。很明显。它偏离了公布的行为。它也出现在1.7.0中,遵循新的透明度编码要求。1.6.x中的相同代码运行良好。我认为如果您先调用setUndercorated(true)或setDefaultLookandFeeldercorated(true),它仍然可以运行。这很奇怪,因为在jdk6中不需要这样做。看起来您可以复制旧的行为,请参阅jdk7 o
Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: The frame is decorated
at java.awt.Frame.setOpacity(Frame.java:960)
at TranslucentWindow$1.run(TranslucentWindow.java:38)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
JFrame.setDefaultLookAndFeelDecorated(true);
//If translucent windows aren't supported, exit.
if (!gd.isWindowTranslucencySupported(TRANSLUCENT)) {
System.err.println(
"Translucency is not supported");
System.exit(0);
}
JFrame.setDefaultLookAndFeelDecorated(true);
// Create the GUI on the event-dispatching thread
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TranslucentWindow tw = new TranslucentWindow();
// Set the window to 55% opaque (45% translucent).
tw.setOpacity(0.55f);
// Display the window.
tw.setVisible(true);
}
});