2012-07-18 9 views
6

Sto sviluppando l'applicazione in Java 6 (1.6.0_24) che utilizza JFrame trasparente per ottenere l'animazione che scompare. Qui è il mio codice:Utilizzo di una finestra trasparente in Java 6 e 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); 
} 

Funziona benissimo sulla mia macchina, ma quando ho provato su un altro PC con Java 7 installato ho il fermo di errore:

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) 

Penso che sia perché in Java 7 I utilizzare i metodi Window.setOpacity(...) anziché AWTUtilities.

È possibile utilizzare la trasparenza nell'app Java 6, che verrà eseguita su Java 7?

+2

se è solo sulla compilazione in JDK6 e funzionante in jdk7, è possibile utilizzare la riflessione sia per il 6 e 7 api. Tuttavia, non c'è modo di modificare il supporto per la trasparenza mancante per le finestre non decorate in jdk7. – kleopatra

risposta

3

Vedere How to Create Translucent and Shaped Windows .. Si parla di una traslucenza "per pixel" che è possibile sfruttare per creare una finestra con java 7 che abbia l'aspetto della finestra traslucida di java 6 che non è più disponibile. Quindi in pratica dovresti scrivere il codice per accontentarlo, oppure potresti optare per una "traslucenza uniforme" che funzioni con entrambi.

Gradient Translucent Window

+0

Grazie per la risposta. Quindi devo prima verificare la compatibilità e abbandonare l'animazione che scompare se non è supportata? – Demiurg

+0

Cosa? Pensavo che il tuo metodo attuale funzionasse per 1.6. In tal caso, utilizzalo fino a quando non viene supportata la nuova trasparenza, quindi utilizza la nuova funzionalità per il resto di 1.6 e 1.7+. –

+0

Sì, funziona, ma in effetti la mia domanda è come compilare 'JFrame' trasparente sul computer con solo' Java 6', quindi il programma funzionerà correttamente sul computer con solo 'Java 7'. Ma penso che la soluzione più semplice sia passare a Java 7. – Demiurg