2012-07-18 17 views
6

Zajmuję się tworzeniem aplikacji w Java 6 (1.6.0_24), która za pomocą przezroczystego JFrame powoduje znikanie animacji. Tu jest mój kodu:Używanie przezroczystego okna w Java 6 i 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); 
} 

Działa prawidłowo na moim komputerze, ale gdy testowałem go na innym komputerze z Java 7 zainstalowany mam odłogowania błąd:

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) 

Myślę, że to dlatego, że w Java 7 I powinien używać metod Window.setOpacity(...) zamiast AWTUtilities.

Możliwe jest użycie przezroczystości w aplikacji Java 6, która będzie działać pod Java 7?

+2

jeśli to tylko o kompilacji w JDK6 i działa w jdk7, można użyć odbicie zarówno 6 i 7 API. Nie ma jednak sposobu na zhackowanie brakującej obsługi przezroczystości dla nieokurowanych okien w jdk7. – kleopatra

Odpowiedz

3

Zobacz How to Create Translucent and Shaped Windows .. Wymienia przezroczystość "na piksel", którą można wykorzystać do utworzenia okna z językiem Java 7, które ma wygląd i działanie przezroczystego okna z biblioteki Java 6, która nie jest już dostępna. Zasadniczo będziesz musiał kodować, aby się do nich dostosować, lub możesz wybrać "jednolitą przezierność", która współdziała z obydwoma.

Gradient Translucent Window

+0

Dzięki za odpowiedź. Więc muszę najpierw sprawdzić kompatybilność i zrezygnować z znikającej animacji, jeśli nie jest ona obsługiwana? – Demiurg

+0

Co? Myślałem, że twoja obecna metoda działa dla wersji 1.6. Jeśli tak, używaj tego, aż nowa przezroczystość będzie obsługiwana, a następnie użyj nowej funkcji przez resztę wersji 1.6 i 1.7+. –

+0

Tak, działa, ale w rzeczywistości moje pytanie brzmi: jak skompilować przezroczyste 'JFrame' na komputerze z' Java 6' tylko, więc program będzie działał poprawnie na komputerze z 'Java 7' tylko. Ale myślę, że najprostszym rozwiązaniem jest przejście na Java 7. – Demiurg

Powiązane problemy