lunes, 13 de junio de 2011

JPanel transparente, JPanel con imagen de fondo

11 comentarios
Hola de nuevo, después de casi un mes sin Internet y sin poder pasaros contenido nuevo, volvemos con un ejemplo muy sencillo de algo que os puede resultar muy útil a muchos.

Se trata de hacer que nuestro JPanel sea transparente y ponerle detrás una imagen de fondo. El resultado es muy bueno.
En primer lugar haremos que nuestro panel sea transparente, esto es, básicamente haciendo que no sea opaco estableciéndole esta propiedad al crear el panel. Y en segundo lugar sobrescribiremos el método paint(Graphics g) de este panel para que antes de pintar todos los elementos nos dibuja la imagen de fondo que le hayamos establecido. ¿Fácil verdad?

Primero el código del panel:

package ejemplo7;

import java.awt.Graphics;
import java.awt.Image;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

/**
 * TransparentPanel.
 */
public class TransparentPanel extends JPanel {

 private Image bgImage;

 public TransparentPanel() {
  super();

  // Hacemos que el panel sea transparente
  this.setOpaque(false);
 }

 /**
  * Lo utilizaremos para establecerle su imagen de fondo.
  * @param bgImage La imagen en cuestion
  */
 public void setBackgroundImage(Image bgImage) {
  this.bgImage = bgImage;
 }

 /**
  * Para recuperar una imagen de un archivo...
  * @param path Ruta de la imagen relativa al proyecto
  * @return una imagen
  */
 public ImageIcon createImage(String path) {
  URL imgURL = getClass().getResource(path);
     if (imgURL != null) {
         return new ImageIcon(imgURL);
     } else {
         System.err.println("Couldn't find file: " + path);
         return null;
     }
 }

 @Override
 public void paint(Graphics g) {

  // Pintamos la imagen de fondo...
  if(bgImage != null) {
   g.drawImage(bgImage, 0, 0, null);
  }

  // Y pintamos el resto de cosas que pueda tener el panel
  super.paint(g);

 }

Y ahora como siempre el código de ejemplo:

package ejemplo7;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 * Ejemplo7.
 */
public class Ejemplo7 {

 private static JFrame frame;

 private static JPanel createExamplePanel() {
  TransparentPanel panel = new TransparentPanel();

  panel.setBackgroundImage(panel.createImage("images/bgImage.jpg").getImage());

  JLabel label = new JLabel("Esto y todo lo que queramos se pinta encima de la imagen de fondo");
  panel.add(label);

  return panel;
 }

 /**
  * Create the GUI and show it. For thread safety,
  * this method should be invoked from the
  * event dispatch thread.
  */
 private static void createAndShowGUI() {

  // Create and set up the window.
  frame = new JFrame("Panel with background image");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  Component contents = createExamplePanel();
  frame.getContentPane().add(contents, BorderLayout.CENTER);

  //Set window size
  frame.setPreferredSize(new Dimension(700,525));

  // Display the window.
  frame.pack();
  frame.setLocationByPlatform(true);
  frame.setVisible(true);
 }

 public static void main(String[] args) {
  // Schedule a job for the event dispatch thread:
  // creating and showing this application's GUI.
  javax.swing.SwingUtilities.invokeLater(new Runnable() {
   public void run() {
    createAndShowGUI();
   }
  });
 }

Así es como quedaría la cosa con la imagen que he elegido, obviamente el resultado dependerá de la imagen que carguéis vosotros.


Un saludo y hasta pronto, espero  :)