Imagen de Fondo Java (sin JLabel)

   En ocasiones anteriores explicaba como hacer esto (Método1 - Método2), y bueno, últimamente he estado diseñando para empresas sistemas Desktop, por lo que utilizar frames no se ve bien, sino que deben utilizarse "JInternalFrame's" los cuales van perfecto para este tipo de sistemas, ahora bien ¿Qué pasa si queremos utilizar un fondo para nuestra aplicación?, el método del "Label" no nos viene porque el layout se maneja de forma diferente, y el método del "Frame" cambia porque se trata de un componente distinto, es entonces cuando debemos hacer unas pequeñas modificaciones....

   Primero lo primero, creamos una nueva clase a la cual le daremos por nombre "MiFondo.java", por ejemplo. La cargamos dentro del mismo paquete (si es que utilizamos paquetes, sino junto con la clase principal) y la instanciamos, entonces veamos, la clase "MiFondo.java" vendría quedando así:

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.border.Border;

public class MiFondo implements Border{

    private BufferedImage image ;

    public MiFondo(BufferedImage image ) {
        this.image=image;}

    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
    int x0 = x+ (width-image.getWidth())/2;
    int y0 = y+ (height-image.getHeight())/2;
    g.drawImage(image,x0,y0,null); }

    public Insets getBorderInsets(Component c) {
    return new Insets(0,0,0,0);}

    public boolean isBorderOpaque() {
    return true; }

    public static void cargarImagen(javax.swing.JDesktopPane jDeskp,File fileImagen) {
        try{
            BufferedImage imagen = ImageIO.read(fileImagen);
            jDeskp.setBorder(new MiFondo(imagen));
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Error al Cargar Imagén del Sistema",
                    "Error", JOptionPane.ERROR_MESSAGE);
        }
    }
}

   Ahora explico de donde viene cada cosa:

   - BufferedImage image: es el contenedor de la imagen, en el se define la dirección del archivo.
   - CargarImagen(): es el método que se encarga de procesar los datos y colocar el fondo.
   - jDeskp: es el JDesktopPane que definimos en la clase principal.
   - FileImagen: es la ruta de la imagen que estamos cargando.

   Una vez definida nuestra clase para dibujar el fondo de nuestra aplicación lo único que nos hace falta es instanciar y definir las variables que hacen referencia al método, entonces el la clase principal colocamos lo siguiente:

public File imagen = new 
File (System.getProperty ("user.dir")+"\\paquete\\imagen.extension");
MiFondo.cargarImagen(jDesktopPane, imagen);

   Donde:

   - File imagen: es la ruta de la imagen, ruta del archivo.
   - MiFondo.cargarImagen(): es el método para aplicar la imagen.

   El código de "System.getProperty" es para obtener la ruta de donde se esta ejecutando nuestra aplicación, es para no tener que dar la ruta definitiva como por ejemplo "/dev/imagen" o "c:\programa\imagen". Con esto solo definimos la ruta dentro de la carpeta del sistema, no damos la ruta definitiva. Entonces, tomando la clase principal que explique en JInternalFrame's, vamos a ver como es el resulado final....

    Imagen: Logo Carltiox en la Web (Descargar).

   Clase "internalframefondo.java" (clase principal):

import java.io.File;
import javax.swing.*;
import java.awt.event.*;

@SuppressWarnings("deprecation")
public class internalframefondo extends JFrame {
 boolean boton=false;
 JDesktopPane dp = new JDesktopPane();
 JPanel Panel1 =new JPanel();
 JPanel Panel2 =new JPanel();
 JPanel Panel3 =new JPanel();
 JInternalFrame iPanel1 = new JInternalFrame("iFrame 1");
 JInternalFrame iPanel2 = new JInternalFrame("iFrame 2");
 JInternalFrame iPanel3 = new JInternalFrame("iFrame 3");
 JTextField TEXTO = new JTextField(25);
 JButton BOTON = new JButton("Cerrar");
 JLabel expli1 = new JLabel("Escribe 'cerrar' para cerrar el iFrame");
 JLabel expli2 = new JLabel("Este es el iFrame 3");
 JMenuBar B = new JMenuBar();
 JMenu MENU = new JMenu("Click Aquí");
 JMenuItem M1 = new JMenuItem("Abrir Ventana 1");
 JMenuItem M2 = new JMenuItem("Abrir Ventana 2");
 JMenuItem M3 = new JMenuItem("Abrir Ventana 3");
 public File imagen = new File (System.getProperty ("user.dir")+"\\logocarlitoxenlaweb.png");

 public internalframefondo() {
  super("Ejemplo de MDI con Fondo");
  setLocation(100,100);
  setSize(640,480);
  setJMenuBar(B);
  add(dp);
  B.add(MENU);
  MENU.add(M1);
  MENU.add(M2);
  MENU.add(M3);
  dp.add(iPanel1);
  dp.add(iPanel2);
  dp.add(iPanel3);
  Panel1.add(expli1);
  Panel1.add(TEXTO);
  Panel2.add(BOTON);
  Panel3.add(expli2);
  iPanel1.add(Panel1);
  iPanel2.add(Panel2);
  iPanel3.add(Panel3);
  iPanel1.pack();
  iPanel2.pack();
  iPanel3.pack();
  TEXTO.addKeyListener(new Comprobar());
  BOTON.addActionListener(new Cerrar());
  M1.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent evt) {
  iPanel1.setVisible(true);
   }
  });
  M2.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent evt) {
  iPanel2.setVisible(true);
   }
  });
  M3.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent evt) {
  iPanel3.setVisible(true);
   }
  });
  iPanel1.setResizable(true);
  iPanel2.setIconifiable(true);
  iPanel3.setClosable(true);
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  MiFondo.cargarImagen(dp, imagen);
  show();
 }

 public class Comprobar extends KeyAdapter{
  public void keyTyped ( KeyEvent evt ){
   if(TEXTO.getText().equalsIgnoreCase("cerrar"))
 iPanel1.setVisible(false);
  }
 }

 public class Cerrar implements ActionListener{
   public void actionPerformed(ActionEvent evt){
 iPanel2.setVisible(false);
  }
 }

 public static void main(String[] arg) {
  JOptionPane.showMessageDialog(null,"Ejemplo de MDI con Fondo...\n");
  JOptionPane.showMessageDialog(null,"By Carlitox ("+
   "http://calitoxenlaweb.blogspot.com)");
  new internalframefondo();
 }
}

   Clase "MiFondo.java" (establece la imagen):

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.border.Border;

public class MiFondo implements Border{

    private BufferedImage image ;

    public MiFondo(BufferedImage image ) {
        this.image=image;}

    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
    int x0 = x+ (width-image.getWidth())/2;
    int y0 = y+ (height-image.getHeight())/2;
    g.drawImage(image,x0,y0,null); }

    public Insets getBorderInsets(Component c) {
    return new Insets(0,0,0,0);}

    public boolean isBorderOpaque() {
    return true; }

    public static void cargarImagen(javax.swing.JDesktopPane jDeskp,File fileImagen) {
        try{
            BufferedImage imagen = ImageIO.read(fileImagen);
            jDeskp.setBorder(new MiFondo(imagen));
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Error al Cargar Imagén",
                    "Error", JOptionPane.ERROR_MESSAGE);
        }
    }
}

   NOTA: recuerda colocar las 2 clases el archivo dentro de la misma carpeta, pues ejemplo esta hecho para esto.... Cualquier problema no dudes en comentar.


5 Comentarios

Escribir Comentario
10 de octubre de 2013, 21:07 delete

esta muy bueno el tutorial te felicito pero creo que seria una buena idea que hagas tutoriales en yutube :)

Responder
avatar
10 de octubre de 2013, 21:11 delete

si me compila pero me aparece un error al cargar la imagen :/

Responder
avatar
30 de octubre de 2013, 6:15 delete

Cual es el error, postea el log y damos con el problema, saludos!!!

Responder
avatar
19 de junio de 2014, 11:59 delete

mandame el ejemplo en un zip porque necesito implementarlo yaaa por favor

Responder
avatar
19 de junio de 2014, 14:24 delete

Clase de comentario este.... Si te estoy dando el código junto con su explicación a detalle, que hasta puedes solo copiar y pegar, para que quieres el zip? No, que bárbaro!

Responder
avatar

Lamentablemente hay muchos usuarios en la red que han llegado al blog para escribir obscenidades, así que la moderación se hace necesaria. Recuerda utilizar un lenguaje correcto y espera a que sea aprobado.

Si necesitas publicar código haz click en "Conversión" para hacerlo legible.
ConversiónConversión