En un post anterior se explico la creacion de una sencilla aplicación MDI en java desde Netbeans, ahora tratando de dar un poco de personalizacion a la aplicacion, en este post se explica el codigo necesario para la incorporación de una imagen de fondo en un formulario MDI en java.
Se crea una nueva clase que implementa la clase abstracta "Border", en el constructor de la nueva clase "ImagenFondo.java" se declara la imagen que se utilizara como fondo, esta imagen se encuentra en el mismo paquete que el resto de las clases, se carga esta imagen en momoria haciendo uso de la clase BufferedImage, despues se sobreescriben todas funciones propias de la clase Border, y en el metodo paintBorder() se dibuja la imagen con drawimage.
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.border.Border;
/**
* @web http://jc-mouse.blogspot.com/
* @author Mouse
*/
public class ImagenFondo implements Border {
BufferedImage fondo;
public ImagenFondo(){
try {
//se obtiene la imagen
URL url = new URL(getClass().getResource("/mdijava/picmouse.jpg").toString());
fondo = ImageIO.read(url);
} catch (IOException ex) {
Logger.getLogger(ImagenFondo.class.getName()).log(Level.SEVERE, null, ex);
}
}
// se sobreescriben metodos propios de Border
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height){
//se dibuja la imagen de fondo en el centro del contenedor
//cada que se redimensione el contenedor, la imagen automaticamente se posiciona en el centro
g.drawImage(fondo, (x + (width - fondo.getWidth())/2),(y + (height - fondo.getHeight())/2), null);
}
public Insets getBorderInsets(Component c){
return new Insets(0,0,0,0);
}
public boolean isBorderOpaque(){
return true;
}
}
La implementacion de esta clase en la aplicacion en Netbeans se realiza de la siguiente manera:
public papa() {
initComponents();
jDesktopPane1.setBorder(new ImagenFondo());
}
Donde papa(), es el nombre del constructor de la clase JFrame que hace de formulario padre para los demas JInternalFrame (Formularios hijos), JDesktopPane es el contenedor para los formularios hijos, y es ahi donde se implementa la clase "imagenFondo,java", añadiendole a su propiedad "Border" la nueva clase creada.
El codigo de ejemplo en el siguiente enlace
Tu aporte me fue de mucha utilidad, es una magifica tecnica y la manera en la que te comunicas es muy entendible. Muchas gracias desde Pachuca Hgo.
ResponderEliminarSaludos y felicidades por tu enzeñar
que tal jc-mouse, antes que nada estoy agradecido por tus aportaciones al area de la programacion y sin mentirte me han apoyado mucho, pero tengo una duda en esta publicacion http://jc-mouse.blogspot.mx/2010/03/imagen-de-fondo-en-una-aplicacion-mdi.html
ResponderEliminarya que hice exactamente lo que describes, y a la hora de compilar y ejecutar corre excelente pero a la hora de hacer el .jar aun jalando la carpeta de src no carga ni el jframe... solo se queda en mi login "le escribo el usuario y contraseña y cuando doy 'accesar' no carga el frame", al menos que le quite la instancia en el constructor del frame es que jala... tienes alguna idea de que `pudiera ser?
que extraño, pero como dices al compilar no existe error entonces fijate en el tamaño de la imagen o en la ruta del archivo imagen, la carpeta SRC no tiene nada que ver al compilar el proyecto, todo se guarda en la carpeta DIST
ResponderEliminarTengo una duda, a esa variable tipo URL le puedo escribir una ruta como C:/imagen.jpg ? O debe estar en la carpeta del proyecto?
ResponderEliminarGracias
Tengo una pregunta, a la variable tipo URL le puedo enviar cualquier ruta? ej. C:/imagen.jpg ??
ResponderEliminarO debe estar en la carpeta del proyecto?
Gracias.
muchas gracias, por fin funciona probe un monton de formas, gracias
ResponderEliminarDisculpe a mi me marca Error a la hora de ejecucion, es decir en la linea de ;
ResponderEliminarEscritorio.setBorder(new ImagenFondo());
que se encuentra en el constructor de la clase y en el metodo run
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Inicio().setVisible(true);
}
});
¿A que se debe?¿Como puedo solucionarlo? De antemano GRACIAS
Que tamaño dimensiones debe tener la imagen y que formato debe estar, ya que no me reconoce algunas.
ResponderEliminarGracias excelente pagina.
¡Excelenteeeeeeeee!
ResponderEliminarVi muchos tutoriales, pero no me quedaba o simplemente terminaba por confundirme. Pero este post me ha ayudado demasiado. Más claro que el agua. ¡Gracias!