Skip to main content

Ventanas transparentes en java

Submitted by drw on
El presente post muestra un interesante articulo de como generar ventanas transparentes para darle una forma diferente a la típica ventana o Frame cuadrado que siempre empleamos en nuestra programación. Aquí les pongo el link que muestra como realizar este tipo de programación pero sus ejemplos no funcionan correctamente así que voy a detallar el código modificado que he creado para poder entenderlo mejor mas adelante.. oops bueno aqui esta la url: http://www.onjava.com/pub/a/onjava/excerpt/swinghks_hack41/index.html Crear translucent y shaped windows, evitando el código nativo, con uso inteligente del screenshot Una de los mas comúnmente pedidos de características de swing es las ventanas transparentes. también llamadas shaped windows, con ventanas que tienen porciones transparentes, permitiendo ver el background del Escritorio y otros programas atraves de ellas. Java no proporciona ninguna forma de crear ventanas transparentes sin hacer uso de la Interface Nativa Java (JNI) (aunque son plataforma nativa debería apoyar la transparencia muy bien), pero eso no va a detenernos. Nosotros podemos hacerlo usando una de mis técnicas favoritas, el screeshot o captura de pantalla. El proceso de imitar una ventana transparente es básicamente:
  1. Crear un screenshot antes de mostrar la ventana.
  2. Usar ese screenshot como fondo(background) de la ventana.
  3. Ajustar la posición el screenshot con la linea superior de la pantalla real, crea la ilusión de transparencia.
Esta el la parte fácil. La parte dificil es actualizar el screenshot cuando la ventana se mueve o cambia. To start off, crear una subclase JPanel que puede capturar la pantalla y dibujarla como el background. como se muestra en el ejemplo Ejemplo: import javax.swing.*; import java.awt.*; import java.awt.event.ComponentListener; import java.awt.event.ComponentEvent; public class TransparentBackground extends JComponent { private JFrame frame; private Image background; public TransparentBackground(JFrame frame) { this.frame = frame; updateBackground( ); } public void updateBackground( ) { try { Robot rbt = new Robot( ); Toolkit tk = Toolkit.getDefaultToolkit( ); Dimension dim = tk.getScreenSize( ); background = rbt.createScreenCapture( new Rectangle(0,0,(int)dim.getWidth( ), (int)dim.getHeight( ))); } catch (Exception ex) { ex.printStackTrace( ); } } public void paintComponent(Graphics g) { Point pos = this.getLocationOnScreen( ); Point offset = new Point(-pos.x,-pos.y); g.drawImage(background,offset.x,offset.y,null); } public static void main(String[] args) { JFrame frame = new JFrame("Ventana Transparente"); TransparentBackground bg = new TransparentBackground(frame); bg.setLayout(new BorderLayout( )); JButton button = new JButton("Esto es un boton"); bg.add("North",button); JLabel label = new JLabel("Esta es una etiqueta"); bg.add("South",label); frame.getContentPane( ).add("Center",bg); frame.pack( ); frame.setSize(450,400); frame.setVisible(true); } } Ejecutalo funciona de forma interesante. Espero les sea de utilidad !!!
Secciones

Contenido Relacionado

Ireport y Oracle en Linux

Ireport y Oracle en Linux

Ejemplo de termometro en Java

Ejemplo de termometro en Java

Estrategias para desarrollo en Palm

Estrategias para desarrollo en Palm