Luego de varias preguntas relacionadas al tema (ubicar una imagen de fondo a un JDialog) me puse a trabajar en el tema y les presento una solución, la misma que sigue lo explicado en el post JFrame con Imagen de Fondo.
El proyecto está estructurado como muestra la imagen a continuación:
La descripción de la misma es la siguiente:
- El JFrame – FrmPrincipal.java tiene un botón cuya función es mostrar el JDialog.
- El JDialog – JDiFondo.java, muestra un JPanel
- Un JPanel – PnlFondoJDialog.java, que muestra la imagen y un botón.
Veamos el código más importante de cada uno de los elementos, empecemos por el JFrame – FrmPrincipal.java
public class FrmPrincipal extends javax.swing.JFrame { /** Creates new form FrmPrincipal */ public FrmPrincipal() { initComponents(); } private void btnMostrarActionPerformed(java.awt.event.ActionEvent evt) { int ancho = 300; int alto = 300; JDiFondo jdiFondo = new JDiFondo(this, true); jdiFondo.setSize(ancho, alto); jdiFondo.setPreferredSize(new Dimension(ancho, alto)); jdiFondo.configurar(); jdiFondo.setVisible(true); } ... }
Usamos setSize y jdiFondo.setPreferredSize, el primero nos permite que la imagen y la ventana del JDialog tengan el mismo tamaño, también se invoca la método configurar del JDialog que lo explicaremos más adelante.
Ahora veremos el JDialog – JDiFondo.java
public class JDiFondo extends javax.swing.JDialog { /** Creates new form JDiFondo */ public JDiFondo(java.awt.Frame parent, boolean modal) { super(parent, modal); initComponents(); } public void configurar(){ PnlFondoJDialog pnlFondo = new PnlFondoJDialog(); pnlFondo.setSize(this.getSize()); this.add(pnlFondo, BorderLayout.CENTER); this.pack(); } ... }
Lo que debemos destacar de está clase es el método configurar, que no existía cuando trabajamos en el post anterior (ubicar la imagen en un JFrame – JFrame con Imagen de Fondo) es necesario éste método por que si ubicamos sus líneas de código en el constructor el panel toma la medida por defecto del JDialog ya que hasta ese momento no le asignamos un tamaño al JDialog (Ver el método btnMostrarActionPerformed del JFrame).
Finalmente el JPanel – PnlFondoJDialog.java este no ha cambiado y sigue el mismo principio que se mencionó en el post: JFrame con Imagen de Fondo.
public class PnlFondoJDialog extends javax.swing.JPanel { /** Creates new form PnlFondo */ public PnlFondoJDialog() { initComponents(); } @Override public void paintComponent(Graphics g){ Dimension tamanio = getSize(); ImageIcon imagenFondo = new ImageIcon(getClass(). getResource("/los/imagen/DSC00857.jpg")); g.drawImage(imagenFondo.getImage(), 0, 0, tamanio.width, tamanio.height, null); setOpaque(false); super.paintComponent(g); } ... }
El resultado final lo pueden ver en la siguiente imagen:
El código completo lo pueden descargar aquí.
Espero que les ayude