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

6

我正在开发一个应用程序,使用透明的JFrame来实现消失动画,它是基于Java 6(1.6.0_24)开发的。以下是我的代码:

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的电脑上测试时,出现了以下错误:

 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 7Java 6应用程序中使用透明度?


2
如果只是在JDK6中编译并在JDK7中运行,您可以使用反射来处理6和7 API。但是,在JDK7中无法绕过未装饰窗口缺少透明度支持的问题。 - kleopatra
1个回答

3
请参见如何创建半透明和形状窗口。它提到了一种“每像素”的半透明效果,您可以利用它来制作具有Java 6中不再提供的半透明窗口外观的Java 7窗口。因此,您需要编写代码来适应任何一种情况,或者您可以选择“统一半透明度”,该选项适用于两种情况。

Gradient Translucent Window


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

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