Foros del Web » Programación para mayores de 30 ;) » Java »

Poner imagen de fondo en MDI: NullPointerException

Estas en el tema de Poner imagen de fondo en MDI: NullPointerException en el foro de Java en Foros del Web. Buenas tardes, He estado tratando de ponerle una imagen de fondo a un MDI, tras realizar una búsqueda encontré e implementé el siguiente código, pero ...
  #1 (permalink)  
Antiguo 30/11/2013, 15:30
Avatar de paula23andrea  
Fecha de Ingreso: noviembre-2012
Mensajes: 38
Antigüedad: 12 años
Puntos: 1
Exclamación Poner imagen de fondo en MDI: NullPointerException

Buenas tardes, He estado tratando de ponerle una imagen de fondo a un MDI, tras realizar una búsqueda encontré e implementé el siguiente código, pero no entiendo por qué me arroja un NullPointerException, Así que agradezco a quien me pueda orientar con este código...


Este código es del javaclass que creé para traer la imagen :

Código Java:
Ver original
  1. package Formularios;
  2.  
  3. import java.awt.Component;
  4. import java.awt.Graphics;
  5. import java.awt.Insets;
  6. import java.awt.image.BufferedImage;
  7. import java.io.IOException;
  8. import java.net.URL;
  9. import java.util.logging.Level;
  10. import java.util.logging.Logger;
  11. import javax.imageio.ImageIO;
  12. import javax.swing.border.Border;
  13.  
  14. public class FondoMDI implements Border {    
  15.     BufferedImage fondo;
  16.     public FondoMDI(){    
  17.         try {      
  18.             //se obtiene la imagen            
  19.             URL url = new URL(getClass().getResource("H://Bases de datos II/LogoBD.png").toString());
  20.             fondo = ImageIO.read(url);    
  21.            
  22.         } catch (IOException ex) {
  23.             Logger.getLogger(FondoMDI.class.getName()).log(Level.SEVERE, null, ex);
  24.         }      
  25.     }
  26.     // se sobreescriben metodos propios de Border
  27.     @Override
  28.     public void paintBorder(Component c, Graphics g, int x, int y, int width, int height){    
  29.         //se dibuja la imagen de fondo en el centro del contenedor
  30.         //cada que se redimensione el contenedor, la imagen automaticamente se posiciona en el centro
  31.         g.drawImage(fondo, (x + (width - fondo.getWidth())/2),(y + (height - fondo.getHeight())/2), null);
  32.     }
  33.  
  34.     @Override
  35.     public Insets getBorderInsets(Component c){
  36.     return new Insets(0,0,0,0);
  37.     }
  38.  
  39.     @Override
  40.     public boolean isBorderOpaque(){
  41.     return true;
  42.     }
  43. }



...
Y este es el fragmento de código donde se llama la clase, el MDI funcionaba perfecto hasta añadir esta línea:

Código Java:
Ver original
  1. public class MDI_Principal extends javax.swing.JFrame {
  2.  
  3.      
  4.       public MDI_Principal() {
  5.         initComponents();
  6.         desktopPane.setBorder(new FondoMDI()); // De acá proviene el error
  7.     }



---
Y este es el conjunto de errores que me genera

Código Java:
Ver original
  1. Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
  2.     at Formularios.FondoMDI.<init>(FondoMDI.java:22)
  3.     at Formularios.MDI_Principal.<init>(MDI_Principal.java:19)
  4.     at Formularios.MDI_Principal$11.run(MDI_Principal.java:281)
  5.     at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
  6.     at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:727)
  7.     at java.awt.EventQueue.access$200(EventQueue.java:103)
  8.     at java.awt.EventQueue$3.run(EventQueue.java:688)
  9.     at java.awt.EventQueue$3.run(EventQueue.java:686)
  10.     at java.security.AccessController.doPrivileged(Native Method)
  11.     at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
  12.     at java.awt.EventQueue.dispatchEvent(EventQueue.java:697)
  13.     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
  14.     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
  15.     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
  16.     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
  17.     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
  18.     at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

Muchas gracias!
  #2 (permalink)  
Antiguo 02/12/2013, 03:32
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: Poner imagen de fondo en MDI: NullPointerException

El problema lo tienes aquí en esta linea

URL url = new URL(getClass().getResource("H://Bases de datos II/LogoBD.png").toString());

¿De verdad tienes un disco llamado H en ese pc y el archivo LogoBD.png está en la ruta que pone?
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #3 (permalink)  
Antiguo 02/12/2013, 09:50
Avatar de paula23andrea  
Fecha de Ingreso: noviembre-2012
Mensajes: 38
Antigüedad: 12 años
Puntos: 1
Pregunta Respuesta: Poner imagen de fondo en MDI: NullPointerException

Sí, es una usb, que siempre queda con ese nombre, y el archivo sí está ahí...
Necesariamente debería estar en el disco duro del pc donde se ejecuta?
__________________
Suerte!!
  #4 (permalink)  
Antiguo 02/12/2013, 09:54
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: Poner imagen de fondo en MDI: NullPointerException

Pues sí, yo lo que veo es que cuando intenta ejecutar esto

getClass().getResource("H://Bases de datos II/LogoBD.png")

si no tienes el recurso devolvería null, y al hacer toString() se va a la porra la aplicación

por eso para estos casos se suelen usar rutas relativas sobre el root de la aplicación en el servidor, para que aunque cambie la aplicación de ubicación se puedan mantener las rutas sobre los recursos.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}

Etiquetas: exception, imagenes, mdi
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:34.