2012-07-18 62 views
6

我正在開發使用透明JFrame獲取消失動畫的Java 6(1.6.0_24)中的應用程序。這裏是我的代碼:在Java 6和Java 7中使用透明窗口

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 6應用程序中使用透明度,這將運行在Java 7

+2

,如果它只有在JDK6編譯和運行JDK7,你可以使用反射兩個6和7的API。儘管如此,沒有辦法繞過jdk7中未裝飾窗口的缺失透明度支持。 – kleopatra 2012-07-18 13:12:22

回答

3

請參閱How to Create Translucent and Shaped Windows ..它提到了一個「每像素」半透明度,您可以利用它來創建一個帶有Java 6的窗口,該窗口具有Java 6中不再可用的半透明窗口的外觀和風格。所以基本上你必須編碼以適應兩者之一,或者你可以用一個「統一的半透明」來適應兩者。

Gradient Translucent Window

+0

感謝您的回答。所以我需要首先檢查兼容性,如果不支持,就會從消失的動畫中退出? – Demiurg 2012-07-18 09:12:01

+0

什麼?我認爲你目前的方法適用於1.6。如果是這樣,那麼直到新的透明度被支持,然後在1.6和1.7+的其餘部分使用新的功能。 – 2012-07-18 09:42:26

+0

是的,它正在工作,但實際上我的問題是如何在只有Java 6的計算機上編譯透明的'JFrame',所以程序只能在具有'Java 7'的計算機上正確運行。但我認爲最簡單的解決方案是切換到Java 7。 – Demiurg 2012-07-18 10:01:28