Foro sobre Java SE > Imagen de Fondo para un JPanel en Netbeans
No tienes que empezar de cero, sino refactorizar tu código existente.
Se puede usar el Matisse de NetBeans con clases extendidas de Swing.
En las propiedades del JPanel creado en Matisse, puedes usar Customize Code -> Custom creation, para declarar tu JPanel extendido, en vez del JPanel por defecto.
public class NewJFrame extends javax.swing.JFrame {
public NewJFrame() {
initComponents();
}
/** This method is called from within the constructor to
initialize the form.
WARNING: Do NOT modify this code. The content of this method is
always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel2 = new NewJPanel(); // JPanel extendido y declarado en una clase aparte
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
getContentPane().add(jPanel2, java.awt.BorderLayout.CENTER);
pack();
}// </editor-fold>
/**
@param args the command line arguments
*/
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new NewJFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JPanel jPanel2;
// End of variables declaration
}
Este es el JPanel extendido anterior, que también puedes crear con Matisse, y adaptarlo a tus necesidades. En el caso que planteas, sobreescribir paintComponent para cambiar o añadir una imagen de fondo.
public class NewJPanel extends javax.swing.JPanel {
public NewJPanel() {
initComponents();
}
/** This method is called from within the constructor to
initialize the form.
WARNING: Do NOT modify this code. The content of this method is
always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jButton1 = new javax.swing.JButton();
setBorder(javax.swing.BorderFactory.createTitledBorder("Panel"));
jButton1.setText("jButton1");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(305, Short.MAX_VALUE)
.addComponent(jButton1)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(243, Short.MAX_VALUE)
.addComponent(jButton1)
.addContainerGap())
);
}// </editor-fold>
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
// End of variables declaration
}
todos los componentes de java swing se heredan de JComponent, ahora esta clase tiene un metodo llamado paintComponent(Graphics g), ahora si tu quieres pintar tu componente con un arreglo especial, lo puedes hacer de la siguiente forma:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class PanelRepintado extends JPanel {
@Override
public void paintComponent(Graphics g) {
//Esto es muy importante para que el componente no deje de tener su
//propio tratamiento
super.paintComponent(g);
//Luego de que el componente se haya pintado normalmente, es hora de
//efectuar mis ajustes
Graphics2D g2 = (Graphics2D) g;
if (backgroundImage == null) {
try {
backgroundImage = ImageIO.read(new FileInputStream("fondo.png"));
} catch (FileNotFoundException ex) {
Logger.getLogger(PanelRepintado.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(PanelRepintado.class.getName()).log(Level.SEVERE, null, ex);
}
}
g2.drawImage(backgroundImage, 0, 0, this);
}
private BufferedImage backgroundImage = null;
}
En escencia, lo que tienes que hacer es sobreescribir este metodo en todos los paneles que deseas personalizar, Se establece a backgroundImage como una variable global con la finalidad de verificar la primera vez que se pinte el componente su estado de nulo y efectuar el proceso de carga una sola vez y no cada vez que se pinte.
Hola amigos como estan, recién me uní a esta gran página que me ha servido de gran ayuda en muchas ocasiones, pero el tema con el que hoy estoy teniendo problemas aun no le encuentro ninguna solución.
Mi problematica es la siguiente: estoy realizando un sistema completo para un hotel como proyecto para mi universidad, todo va de maravilla, pero quería darle más presentación a mi sistema para lo cual queria colocar imagenes de fondo a varios de los paneles que tienen mis JFrame. He encontrado varias paginas donde hacen esto haciendo una subclase de JPanel, se que asi funciona, mi problematica vien en el hecho de que hice mi sistema utilizando el ayudante de netbeans por lo que si utilizo esta forma tendria que empezar desde cero, necesito su ayuda amigos. ¿No existe alguna manera de colocar una imagen de fondo a un JPanel sin tener que crear una subclase de esta misma?