0

Estoy creando un JFrame con un panel en java que muestra una serie de JButtons, JLabels y JTextFields por pantalla al usuario. Estos tres elementos que acabo de mencionar me funcionan perfectamente y ahora estoy intentando añadir imágenes y quiero para ello usar la clase java.awt.Image. He añadido la imagen en mi proyecto y la ruta.

Estoy ejecutando el código desde NetBeans. El problema es que NetBeans me obliga a inicializar la variable g (que es la variable de tipo Graphics que estoy usando) a un valor, así que le he asignado null. Al ejecutar el código me salta una NullPointerException así que creo que NetBeans no me está haciendo nada ya que mantiene el valor inicial de g que es null. Este es mi código:

package practica.pkgfinal.mtpa;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

public class Panel extends JFrame{
    
    public void crearImagenes(Graphics g){
        super.paintComponents(g);
        try{
            Image img = ImageIO.read(new File("piedra_papel_tijeras.jpg"));
            g.drawImage(img, 20, 20, 90, 90, null);
            
        }catch(IOException ioe){
            ioe.toString();
        }
    }
    
    public Panel(){
        
        JPanel panel = new JPanel();
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(500, 300);
        setResizable(true);
        panel.setLayout(null);
        
        Font Arial = new Font("Arial", Font.PLAIN, 13);
        Font ArialBold = new Font("Arial", Font.BOLD, 20);
        Graphics g = null;
        
        JButton aceptar = new JButton();
        aceptar.setText("Aceptar");
        aceptar.setBounds(100, 200, 128, 30);
        panel.add(aceptar);
        
        /*Aquí hay unos cuantos JButtons, JLabels y JTextFields más que me funcionan bien*/
        /*...*/
        
        crearImagenes(g);
        this.add(panel);
    }
}

¿Qué puedo hacer para evitar la NullPointerException y que se muestre la imagen en mi JPanel?

  • ¿Responde esto a tu pregunta? [¿Cuál es la solución a todos los errores NullPointerException presentes, pasados y futuros?](https://es.stackoverflow.com/questions/42977/cu%c3%a1l-es-la-soluci%c3%b3n-a-todos-los-errores-nullpointerexception-presentes-pasados) – Mauricio Contreras Jul 19 '20 at 15:42
  • @MauricioContreras En base a la primera premisa de la respuesta más votada del link de esa pregunta, tengo que inicializar ```g``` a un valor no nulo. El problema es que no sé a que valor inicializar ```g``` porque no me manejo mucho con la clase ```Graphics```. Estoy haciendo mis primeros programas con inclusión de imágenes por ```java.awt.image``` y soy un novato en esto – Nelson Tuesta Jul 19 '20 at 15:49

1 Answers1

2

Para evitar esa excepción simplemente no deberías inicializar a g con null, de hecho tampoco se debería crear ese objeto Graphics ni llamar a crearImagenes en el constructor Panel porque perfectamente puedes redefinir el método paintComponent del JPanel asi:

JPanel panel=new JPanel() {
  @Override
  public void paintComponent(Graphics g) {
    crearImagenes(g);
  }
};

De ese modo ya tienes el argumento g de paintComponent y a su vez lo entregas a crearImagenes para que haga su trabajo.

Adicionalmente el método crearImagenes no debería tener el super.paintComponents

JohnnyTB
  • 2,592
  • 1
  • 8
  • 17