Imagen de fondo para jPanel no funciona

Soy nuevo en la creación de GUIs, así que decidí probar el generador de Windows para eclipse, y si bien tengo algunas dudas. He estado buscando pero no veo una buena manera de agregar una imagen de fondo a mi “menú”. Por ejemplo, intenté esto:

public Menu() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(50, 50, 300, 250); //Dimensiones contentPane = new JPanel() { //Imagen de Fondo public void paintComponent(Graphics g) { Image img = Toolkit.getDefaultToolkit().getImage( Menu.class.getResource("/imgs/rotom.jpg")); g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this); } }; 

Y agregando las siguientes clases:

  import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; 

Pero en vano la ventana se mantiene con su color gris opaco, hasta ahora mi código es el estándar que WindowsBuilder cocina para usted más 4 botones, pero dudo que sean importantes aquí. ¿No debería el código que agregué anular el método paintComponent () del jPanel y dibujar la imagen en él?

La clase para el menú está en un paquete dentro de mi proyecto y la imagen está dentro de un paquete imgs dentro del mismo proyecto.

Muchas gracias por adelantado.

Un método simple, si no está interesado en cambiar el tamaño de la imagen de fondo o aplicar ningún efecto, debe usar un JLabel

 BufferedImage bg = ImageIO.read(Menu.class.getResource("/imgs/rotom.jpg")); JLabel label = new JLabel(new ImageIcon(bg)); setContentPane(label); setLayout(...); 

Este enfoque tiene limitaciones (más allá de la escala), ya que el tamaño preferido de la etiqueta siempre será el de la imagen y nunca tendrá en cuenta su contenido. Esto es bueno y malo.

El otro enfoque, que parece estar usando, es usar un componente especializado

 public class BackgroundPane extends JPanel { private BufferedImage img; public BackgroundPane(BufferedImage img) { this.img = img; } @Override public Dimension getPreferredSize() { return img == null ? super.getPreferredSize() : new Dimension(img.getWidth(), img.getHeight()); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(img, 0, 0, this); } } 

Debe evitar intentar realizar cualquier tarea en el método paintComponent , que puede tomar tiempo para completar, ya que paintComponent se puede llamar con frecuencia y, por lo general, en una sucesión rápida ….

Hacer que la imagen se escale cuando se cambia el tamaño del componente es una pregunta completa en sí misma, para algunas ideas, puedes echarle un vistazo a …

  • Java: mantenimiento de la relación de aspecto de la imagen de fondo de JPanel
  • Java: fondo JPanel no escala
  • Calidad de imagen después del cambio de tamaño muy baja – Java
  • Lectura / carga de imágenes

Ah, y, debe evitar extenderse directamente desde contenedores de nivel superior, como JFrame , reducen la reutilización de sus componentes y lo encerran en un solo contenedor