Java教程半透明窗口示例是否给那些使用jdk7的人带来了麻烦?

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>(

这是我的建议

如果在支持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>(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(窗口))
如果请求的不透明度值小于1.0f,并且不满足上述任何条件,则窗口不透明度将不会更改,并且将抛出IllegalComponentStateException


您看到的行为已记录在案,并且是预期的行为。

这是一个已验证的错误。我已经向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);
        }
    });