2012-07-06 9 views
8

Ich versuche, ein Vollbild-Fenster zu erstellen, die den gesamten Bildschirm mit Java abdecken. Dieses Fenster muss ebenfalls transparent sein (ca. 30% -50% transparent). Wenn ich den ganzen Bildschirm sage, meine ich, dass er alles abdeckt (einschließlich Dock/Taskbar/Menüleiste in OSX/Linux/Windows), und wenn ich mit Transparenz sage, meine ich eine Echtzeittransparenz und nicht nur einen gehackten Screenshot. Hier ist, was ich bin mir bewusst-of/versucht:java Vollbild-Fenster mit Transparenz

  • Mit Java Vollbild-API: während es einen echten Vollbild schafft, kann man nicht eine gewisse Transparenz mit ihm haben kann (nur undurchsichtige Farbe). Ein Hack besteht darin, einen Screenshot des gesamten Desktops zu erstellen und als Hintergrund für das Fenster festzulegen. Dies bedeutet jedoch, dass es sich nicht um Echtzeit-Transparenz handelt.
  • Einstellung der Fenstergröße zur Anpassung an die Bildschirmgröße: Während der Bildschirm den gesamten Bildschirm ausfüllt, wird das Fenster in bestimmten Betriebssystemen (z. B. Mac OS X) hinter dem Dock/der Menüleiste dargestellt und nicht darüber. Transparenz funktioniert hier jedoch.
  • Verwendung setWindowOpacity API: es im zweiten Fall arbeiten, aber nicht in dem ersten (Vollbild API)
  • Verwendung setBackground mit alpha: es wie die setWindowOpacity arbeiten, aber nur in bestimmten OSes. Funktioniert aber auch nicht mit der Vollbild-API.
  • Verwendung JFrame/JWindow/JDialog/Frame/Fenster: versuchte jedes Fenster Modell ich konnte, ohne Erfolg

Also, wenn ich frage dies möglich ist, durch einen anderen Hack, dass ich nicht bewusst bin, dann Ich würde mich freuen, davon zu hören.

Ziel ist es, einen halbtransparenten Vollbildschirm über den Desktop zu legen.

+0

ich kurz verfolgte etwas Ähnliches in dieser Woche zu speichern. Ich hatte gehofft, einen farbigen Filter zu erstellen. Mausklicks müssen die Elemente hinter dem Filter und nicht den Filter treffen. Ich habe nicht zu hart geforscht, also wenn jemand da draußen dann klasse ist! – mrswadge

+1

@mrswadge: Sie können Maus-Listener zu Ihrem Fenster hinzufügen und dann, wenn ein Mausereignis ausgelöst wird (z. B. Klick), das Fenster wechseln und java.awt.Robot verwenden, um das Ereignis zu simulieren (mousePress). Dies löst einen Teil Ihres Problems. Hoffen wir, dass sie den Teil über True-Fullscreen/Transparenz lösen. – ccit

Antwort

6
  • ist nur mit sichtbarem TaskBar e.i. möglich.

.

GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds(); 
  • sonst hast du und Ausnahme

.

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: 
The effects for full-screen windows are not supported. 

oder durch brutte_force-DirectX mit meinem PC twicw vereisen, power_off nur PC GPU

import com.sun.awt.AWTUtilities; 
import java.awt.Dimension; 
import java.awt.GraphicsEnvironment; 
import java.awt.Rectangle; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class JFrameOpacityExample { 

    private JFrame myFrame = new JFrame("Test Frame"); 
    private boolean opacity = true; 
    private boolean resize = true; 
    private JButton button = new JButton("Opacity"); 
    private JButton button1 = new JButton("Resize"); 

    public JFrameOpacityExample() { 
     button.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent evt) { 
       Object src = evt.getSource(); 
       if (opacity) { 
        AWTUtilities.setWindowOpacity(myFrame, 0.50f); 
        opacity = false; 
       } else { 
        AWTUtilities.setWindowOpacity(myFrame, 1.0f); 
        opacity = true; 
       } 
      } 
     }); 
     button1.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent evt) { 
       Object src = evt.getSource(); 
       if (resize) { 
        Rectangle dim = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds(); 
        int h = dim.height; 
        int w = dim.width; 
        myFrame.setBounds(00, 00, w, h); 
        resize = false; 
       } else { 
        myFrame.setBounds(100, 100, 400, 400); 
        resize = true; 
       } 
      } 
     }); 
     JPanel panel = new JPanel(); 
     panel.add(button); 
     panel.add(button1); 
     myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     myFrame.add(panel); 
     myFrame.setSize(400, 400); 
     myFrame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       JFrameOpacityExample jFrameOpacityExample = new JFrameOpacityExample(); 
      } 
     }); 
    } 
} 
+0

'com.sun.awt.AWTUtilities' Dieses Beispiel war einer der wenigen guten Gründe, die ich gesehen habe, um mich in' com.sun'-Klassen zu vertiefen. Danke für das Teilen! :) –

+0

Ich habe schon etwas gemacht, was Sie zusammengefügt haben. Sie haben die 'setWindowOpacity'-API (Punkt 3) zusammen mit der Bildschirmgröße verwendet, um die Bildschirmauflösung (Punkt 2) zu erreichen. Sie können es mit 'getDefaultToolkit(). GetScreenSize()' und dem Aufruf von 'setWindowOpacity' dynamisch an den gesamten Bildschirm anpassen, aber es befindet sich immer noch hinter dock/menubar/... etc. Auch "DirectX" ist nicht plattformübergreifend. Sie erhalten entweder Transparenz oder Vollbild, aber nicht beides.Ich suche nach einem Weg, beides zu erreichen, wie in der Frage erläutert. Wenn Java beides kann, warum implementieren/erlauben sie diese nicht zusammen? Vielen Dank. – ccit

+0

nicht sicher mit OpenGL, da kann ich keinen klaren Weg finden (ohne meinen PC zu töten), sicher vielleicht kann jemand das tun, aber ich denke, dass nicht für Windows-Plattform verfügbar, ich hoffe, dass ich falsch liege – mKorbel