1

I tried to do a program that just show an image, everything goes right but the console shows this warning... The image shows fine but i wanna know what is the console warning and how to solve it Here my main class...

    public class main extends JFrame{
     Image ryu;
     imagen objRyu;
     public main(){
            super("Imagen1");
            this.setSize(500,500);
            this.setVisible(true);
            this.setResizable(true);
            this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            objRyu = new imagen(ryu,"images/Ryu.png",100,100);
            repaint();

        }



    public static void main(String[] args) {
        new main();

    }
    public void paint(Graphics g){
        Graphics g2 = (Graphics2D)g;
         g2.setColor(Color.gray);
         g2.fillRect(0, 0, 500, 500);
         g2.drawImage(objRyu.getImagen(), 100, 50, objRyu.getAncho(), objRyu.getAlto(), null);


    }

}

my imagen class

 public class imagen {
    InputStream imgStream;
    private Image imagen;
    private int ancho;
    private int alto;

    public imagen(Image imagen, String ruta,int ancho, int alto){
        this.imagen = imagen;
        this.ancho = ancho;
        this.alto = alto;

        try{
            imgStream = imagen.class.getResourceAsStream(ruta);
            this.imagen = ImageIO.read(imgStream);
        }catch(IOException e){
            e.printStackTrace();
        }


    }

    public int getAncho() {
        return ancho;
    }

    public int getAlto() {
        return alto;
    }

    public Image getImagen() {
        return imagen;
    }

and the console log...

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at main.paint(main.java:34)
at javax.swing.RepaintManager$3.run(Unknown Source)
at javax.swing.RepaintManager$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.access$1100(Unknown Source)
at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at main.paint(main.java:34)
at javax.swing.RepaintManager$3.run(Unknown Source)
at javax.swing.RepaintManager$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.access$1100(Unknown Source)
at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
mKorbel
  • 109,525
  • 20
  • 134
  • 319
Marcelo Alarcon
  • 394
  • 1
  • 3
  • 17

3 Answers3

6

The overridden paint() method is called immediately after calling setVisible(true) method and at that point object objRyu is null.


Some Points:

  1. Don't directly paint on JFrame instead use a container such as JPanel and add it in JFrame.

  2. Instead of overriding paint() method use paintComponent() method for JPanel.

    @Overrie
    public void paintComponent(Graphics g) {
         super.paintComponent(g);
         //your custom painting here
    }
    
  3. Call JFrame.setVisible() in the end after adding all the component.

  4. Use SwingUtilities.invokeLater() to make sure that EDT is initialized properly.

    Read more

  5. Don't extend any class until and unless you are modifying the existing logic.

    Read more


Read more

Community
  • 1
  • 1
Braj
  • 46,415
  • 5
  • 60
  • 76
4

The error indicates that objRyu is null. As soon as any Swing component becomes visible, it is painted and later refreshed again.

//make this happen early
            objRyu = new imagen(ryu,"images/Ryu.png",100,100);
// this should be last
            this.setVisible(true);
ldmtwo
  • 419
  • 5
  • 14
0

I got it , just change the object call after the constructor

public class main extends JFrame{
 Image ryu;
 imagen objRyu;
 public main(){
        super("Imagen1");
        objRyu = new imagen(ryu,"images/Ryu.png",100,100);
        this.setSize(500,500);
        this.setVisible(true);
        this.setResizable(true);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);



    }
Marcelo Alarcon
  • 394
  • 1
  • 3
  • 17