2011-10-04 16 views
5

Sí, esta pregunta está en todas partes. Pero todas las soluciones (de trabajo) utilizan AWTUtilities toolkit, que está restringido.Java: el viejo JFrame transparente, sin librerías restringidas

So. Solo quiero controlar la opacidad de mi ventana. No es necesario dar forma o sin decorar. Solo un contenido transparente (fácil) y un fondo JFrame transparente (ridículamente difícil).

Podría haber jurado que obtuve la combinación correcta de cosas ayer, pero ahora parece que no puedo reproducirlo. También hay algunas soluciones por ahí sin usar AWTUtilities, pero no funcionan ... ¿alguien tiene una buena solución?

Un ejemplo de mi código en su defecto:

public static void main(String[] args) { 
    JFrame test = new JFrame(); 
    test.setSize(400, 400); 
    test.setLocationRelativeTo(null); 
    test.setUndecorated(true); 
    test.setBackground(new Color(0, 0, 0, 0)); 
    test.getContentPane().setBackground(new Color(0,0,0,0)); 
    test.setVisible(true); 
} 

pero esto sólo hace un cuadrado blanco. Cerca pero no cigarro. También intenté sobreescribir el método de pintura, y alguien dijo algo sobre tirar el canal alfa, pero eso lo hizo negro (por supuesto). Entonces ... Stack Overflow es.

Si hay un engañado que responde esto exactamente, indíquemelo y lo eliminaré de inmediato.

actualización por las solicitudes de comentarios, he aquí una historia de cómo llegué aquí:

El primer enlace de todo el mundo llega a decir how to create translucent and shaped windows. Esto tiene varias líneas de allí similar a" ... la trama con translúcido un nivel de opacidad del 75% ". Entonces ... parece que están definidos de la misma manera, al menos en ese artículo. Lamentablemente usan la biblioteca.

Un par de enlaces que podría perseguir abajo:

Una solución de "trabajo" que no trabajan se informó en http://www.java-gaming.org/index.php?topic=24635.0 que muestra algo de esperanza, pero no pude conseguir que funcione.

http://techgearup.wordpress.com/2008/09/19/transparent-jframe-background/ es una forma de hackear usando capturas de pantalla y se duplica en algunos otros lugares.

+3

Se puede utilizar Java 7? ¿Podría vincular algunas de las soluciones de trabajo para que veamos lo que ha intentado? –

+1

No [confundir] (http://stackoverflow.com/questions/3517722/java-transparent-jscrollpane/3518047#3518047) _opacity_ y _transparency_. – trashgod

+0

De acuerdo, esta es una de las nuevas características en Java 7: http://download.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html –

Respuesta

1

No puede hacer esto sin utilizar Java v.6u10 + o bibliotecas de terceros que llaman a código nativo. En Swing Frames, Dialogs y Windows se consideran 'componentes de nivel superior' y se representan en el sistema de ventanas subyacente. Antes de Java v6u10, todos los componentes de nivel superior tenían un fondo opaco y grisáceo predeterminado, y no había forma de cambiar esto desde el código Java.

+0

Aparentemente Java 6u10 ha estado fuera de servicio desde octubre de 2008, lo que es suficiente para que mis usuarios lo tengan. ¿Cómo se puede lograr esto en versiones posteriores a Java 6u10? – Ben

+0

En 6u10 - tiene que usar AWTUtilities, después de las 7 agregaron métodos a Window y algunas otras clases. http://download.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html#6u10 (me doy cuenta de que has configurado AWTUtilities como "restringido", pero básicamente es la única forma en que Java te proporciona esto.) – Nate

+0

OK gracias por la ayuda. Estoy trabajando en un proyecto de código abierto y no estoy seguro de la actitud hacia la restricción de archivos. Pero esa es una pregunta diferente :) – Ben

0

Suspiro Me encontré con el mismo problema, y ​​después de mucho tiempo trabajando en ello, encontré la manera de obtener una pantalla transparente correctamente configurada en mi computadora. Sin embargo, muchas cosas dejan de funcionar tan pronto como establece el marco como transparente. Si usa la declaración JTextArea en cualquier lugar, inmediatamente deja de funcionar. ¡Ni siquiera lanzará un error!

Así que aquí está el código, espero que esto sea de alguna utilidad. PLZ responder si haces un JScrollPane trabajar con él :)

public class gui { 
    public frame f; 
    public String name = "Transparent?"; //name your frame * 
    public JButton exit = new JButton("Exit"); 
    public gui(){ //non-static context 
     f = new JFrame(name); 
     f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //* 
     f.setLocationRelativeTo(null); 
     f.setExtendedState(f.getExtendedState() | JFrame.MAXIMIZED_BOTH); 
     //maximizes window. if you dont want it, f.setSize(int, int) 
     f.setUndecorated(true); //necessary for setOpacity 
     f.setOpacity(.7f); //achieve trasparancy 
     f.setVisible(true); //show window 
     exit.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent arg0){ 
       System.exit(0); 
      } 
     }); 
     f.add(exit, BorderLayout.CENTER); 
     //since X is not available in the window, make a button to exit 
    } 

    public static void main(){ 
     new gui(); 
    } 
} 
//* Note: since the default Window manager is set off with setUndecorated(true), 
// the name and buttons won't really show. 
+0

Ah, olvidé mencionar, JTextField todavía funciona. Lo único que no funciona hasta ahora (las cosas que estaba usando) es JTextArea y JScrollPane Todavía no he probado las fronteras, pero no es la principal preocupación – nkazuko

+1

por favor aprenda las convenciones de nomenclatura de Java y adhiérase a ellas – kleopatra