在 Java 6 和 Java 7 中使用透明窗口

Posted

技术标签:

【中文标题】在 Java 6 和 Java 7 中使用透明窗口【英文标题】:Using transparent window in both Java 6 and Java 7 【发布时间】:2012-07-17 04:05:57 【问题描述】:

我正在Java 6 (1.6.0_24) 中开发应用程序,它使用透明的JFrame 来获得消失的动画。这是我的代码:

public static void slowDisappearWindowAction(Window source, int milisSlow, int milisFast) throws InterruptedException
    float level = 1.0f;
    //slow effect -> 50%
    for(int i=0; i<8 ; i++)
        level=level-0.05f;
        AWTUtilities.setWindowOpacity(source,level);
        Thread.sleep(milisSlow);
    
    //fast effect -> 0% 
    for(int i=0; i<8 ; i++)
        level=level-0.05f;
        AWTUtilities.setWindowOpacity(source,level);
        Thread.sleep(milisFast);
    
    AWTUtilities.setWindowOpacity(source,0.1f);

它在我的机器上运行良好,但是当我在另一台安装了Java 7 的 PC 上测试它时,我遇到了休闲错误:

 Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException:
 The frame is decorated
    at java.awt.Frame.setOpacity(Unknown Source)
    at java.awt.Window$1.setOpacity(Unknown Source)
    at com.sun.awt.AWTUtilities.setWindowOpacity(Unknown Source)
    at pl.design.bead.pattern.model.window.WindowHelper.slowDisappearWindowAction(WindowHelper.java:21)
    at pl.design.bead.pattern.forms.MainForm$ExitController.windowClosing(MainForm.java:123)
    at java.awt.AWTEventMulticaster.windowClosing(Unknown Source)
    at java.awt.Window.processWindowEvent(Unknown Source)
    at javax.swing.JFrame.processWindowEvent(Unknown Source)
    at java.awt.Window.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

我认为这是因为在Java 7 中我应该使用Window.setOpacity(...) 而不是AWTUtilities 方法。

可以在Java 6 应用程序中使用透明度,它将在Java 7 上运行?

【问题讨论】:

如果只是在 jdk6 中编译并在 jdk7 中运行,则可以对 6 和 7 api 使用反射。不过,没有办法解决 jdk7 中对未装饰窗口缺少的透明度支持。 【参考方案1】:

请参阅How to Create Translucent and Shaped Windows.. 它提到了“每像素”半透明性,您可以利用它来使用 java 7 制作一个具有 java 6 中不再可用的半透明窗口的外观和感觉的窗口。因此,基本上您必须编写代码以适应其中任何一个,或者您可以使用适用于两者的“统一半透明”。

【讨论】:

感谢您的回答。所以我需要先检查兼容性,如果不支持就退出消失动画? 什么?我认为您当前的方法适用于 1.6。如果是这样,请在支持新透明度之前使用它,然后在 1.6 和 1.7+ 的其余部分使用新功能。 是的,它正在工作,但实际上我的问题是如何在只有Java 6 的计算机上编译透明的JFrame,这样程序才能在只有Java 7 的计算机上正确运行。但我认为最简单的解决方案是切换到 Java 7。

以上是关于在 Java 6 和 Java 7 中使用透明窗口的主要内容,如果未能解决你的问题,请参考以下文章

java 怎么让JLabel和JPanel透明?

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Java - ol' 透明 JFrame,没有受限库

Java:带有非透明组件的透明 Windows?

剑指 Offer 59 - I. 滑动窗口的最大值 c++/java详细题解

剑指 Offer 59 - I. 滑动窗口的最大值 c++/java详细题解