2012-07-18 19 views
6

Estoy desarrollando una aplicación en Java 6 (1.6.0_24) que usa JFrame transparente para obtener la animación que desaparece. Aquí está mi código:Uso de ventana transparente en Java 6 y 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); 
} 

Funciona bien en mi máquina, pero cuando lo probé en otro PC con Java 7 instalado error he barbecho:

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) 

Creo que es debido a que en Java 7 I debería usar Window.setOpacity(...) en lugar de AWTUtilities métodos.

¿Es posible utilizar la transparencia en la aplicación Java 6, que se ejecutará en Java 7?

+2

si es sólo sobre la compilación de jdk6 y funcionando en JDK7, se puede utilizar tanto para la reflexión 6 y 7 API. Sin embargo, no hay forma de piratear el soporte faltante de transparencia para ventanas sin decorar en jdk7. – kleopatra

Respuesta

3

Consulte How to Create Translucent and Shaped Windows .. Menciona una translucidez "por píxel" que puede aprovechar para hacer una ventana con java 7 que tiene la apariencia de la ventana translúcida de java 6 que ya no está disponible. Entonces, básicamente, tendrías que codificar para adaptarse a cualquiera de los dos, o podrías ir con una "translucidez uniforme" que funciona con ambos.

Gradient Translucent Window

+0

Gracias por su respuesta. Entonces, ¿debo verificar primero la compatibilidad y renunciar a la animación que desaparece si no es compatible? – Demiurg

+0

¿Qué? Pensé que tu método actual funcionaba para 1.6. Si es así, úselo hasta que se haya admitido la nueva transparencia, luego use la nueva funcionalidad para el resto de 1.6 y 1.7+. –

+0

Sí, está funcionando, pero de hecho mi pregunta es cómo compilar 'JFrame' transparente en la computadora con' Java 6' solamente, por lo que el programa se ejecutará correctamente en la computadora con 'Java 7' solamente. Pero creo que la solución más simple es cambiar a Java 7. – Demiurg