2012-07-06 30 views
8

Estoy tratando de crear una ventana de pantalla completa que cubra toda la pantalla usando Java. Esta ventana también debe tener cierta transparencia (aproximadamente 30% -50% transparente). Cuando digo pantalla completa, me refiero a que cubre todo (incluido el dock/barra de tareas/barra de menú en OSX/Linux/Windows), y cuando digo con transparencia, me refiero a una transparencia en tiempo real y no solo a una captura de pantalla pirateada. Esto es lo que soy consciente de/intenté:ventana de pantalla completa de Java con transparencia

  • Uso de la API de pantalla completa de Java: mientras crea una pantalla completa verdadera, no puede tener algo de transparencia (solo color opaco). Un truco consiste en tomar una captura de pantalla de todo el escritorio y establecerlo como fondo para la ventana, pero esto significa que no se trata de transparencia en tiempo real.
  • Configuración del tamaño de la ventana para que coincida con la dimensión de la pantalla: mientras llena toda la pantalla, en ciertos sistemas operativos (por ejemplo, Mac OS X) la ventana se mostrará detrás del dock/barra de menú y no encima. Sin embargo, la transparencia funciona aquí.
  • Usando la API setWindowOpacity: funciona en el segundo caso, pero no en el primero (API de pantalla completa)
  • Usando setBackground con alpha: funciona como setWindowOpacity, pero solo en ciertos sistemas operativos. Pero tampoco funciona con la API de pantalla completa.
  • Uso JFrame/JWindow/JDialog/marco/ventana: trató cada modelo de ventana pude, sin ninguna suerte

Así que estoy preguntando si esto es posible a través de un otro truco que no soy consciente de, a continuación, Estaré feliz de escuchar sobre.

El objetivo es superponer una pantalla completa semitransparente sobre el escritorio.

+0

Me brevemente perseguía algo similar esta semana. Esperaba crear un filtro de color. Los clics del mouse necesitarían golpear los elementos detrás del filtro y no el filtro. No investigué demasiado, así que si alguien sabe, ¡genial! – mrswadge

+1

@mrswadge: puede agregar detectores de mouse a su ventana y luego, cuando se active el evento del mouse (por ejemplo, haga clic en), cambie la ventana y use java.awt.Robot para simular el evento (mousePress). Esto resuelve parte de tu problema. Esperemos que resuelvan la parte sobre la verdadera pantalla completa/transparencia. – ccit

Respuesta

6
  • es posible solo con TaskBar e.i visible.

.

GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds(); 
  • de otro modo que tienes y excepción

.

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

o utilizando brutte_force-DirectX Freezed mi twicw PC, sólo se power_off para salvar la GPU de PC

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' Ese ejemplo fue una de las pocas buenas razones que he visto para profundizar en las clases' com.sun'. ¡Gracias por compartir! :) –

+0

Ya hice algo similar a lo que juntas. Utilizaste la API 'setWindowOpacity' (punto 3) junto con la especificación del tamaño de la pantalla para que coincida con la resolución de la pantalla (punto 2). Puede hacer que se ajuste a toda la pantalla usando 'getDefaultToolkit(). GetScreenSize()' y llamando 'setWindowOpacity' de forma dinámica, pero seguirá estando detrás de dock/menubar/... etc. Además 'DirectX' no es multiplataforma. O obtienes transparencia o pantalla completa verdadera, pero no ambas.Estoy buscando una manera de lograr ambas cosas como se explica en la pregunta. Si Java puede hacer las dos cosas, ¿por qué no implementarlas/permitirlas juntas? Gracias. – ccit

+0

no estoy seguro con OpenGL, no puedo encontrar la manera clara (sin matar a mi PC), seguro que alguien puede hacerlo, pero creo que no está disponible para la plataforma de Windows, espero que me equivoque – mKorbel

Cuestiones relacionadas