Hola,
La única parte que me parece extraño de ese procedimiento es usar una etiqueta o un panel para mostrar el fondo. Una etiqueta es un componente y no hay forma de mandarla hasta atrás de los demás componentes eficientemente, los Layouts no están hechos para eso.
Ahora en el caso del Panel, porque no pintar el fondo sobre el fondo del Frame, y no sobre el fondo del Panel que está en el fondo, solo es agregar un componente problemático en este caso, aunque para otras aplicaciones y usos resulta indispensable hacerlo así.
Ahora bien ... ¿donde está el JDesktopPane?, para usar JInternalFrames necesitas un JDesktopPane para que las ventanas internas funcionen correctamente, sino el Layout del Frame va a dar problemas.
Una posible solución sería que crearas un JDesktopPane personalizado, una clase que lo extienda y sobre el JDesktopPane pintas el fondo. Por ejemplo:
Código Java:
Ver originalprivate class MyJDesktopPane
extends javax.
swing.
JDesktopPane { @Override
protected void paintComponent
(java.
awt.
Graphics g
) { super.paintComponent(g);
g.drawImage(fondo.getImage(), 0, 0, getWidth(), getHeight(), null);
}
}
En ese caso yo usé una clase privada para no crear otros archivos como ejemplo, pero puedes hacer una clase pública en otro archivo diferente.
Ahora creas una instancia del JDesktopPane y la colocas como el ContentPane del JFrame, todos los frames internos los tienes que agregar al JDesktopPane ('desk' en este caso) para que tengan la funcionalidad de moverse y arrastrarse correctamente.
Código Java:
Ver originaldesk = new MyJDesktopPane();
frame.setSize(200, 200);
frame.setVisible(true);
desk.add(frame);
setContentPane(desk);
En este caso agregué un JInternalFrame genérico solo como ejemplo. Al final lo que sucede es esto: la imagen se está pintando en el fondo del JDesktopPane y sobre este se pintan los JInternalFrames; no necesitas un Label ni un Panel para pintar el fondo puesto que solo te va a crear inconvenientes con los Layout y los InternalFrames.
Saludos,
ps:
El ejemplo funcionando con un menú, el fondo y un InternalFrame,
Código Java:
Ver originalpackage demo;
public class MyJFrame
extends javax.
swing.
JFrame {
private javax.
swing.
JMenu jMenu1
; private javax.
swing.
JMenu jMenu2
;
MyJDesktopPane desk;
private class MyJDesktopPane
extends javax.
swing.
JDesktopPane { @Override
protected void paintComponent
(java.
awt.
Graphics g
) { super.paintComponent(g);
g.drawImage(fondo.getImage(), 0, 0, getWidth(), getHeight(), null);
}
}
public MyJFrame() {
fondo
= new javax.
swing.
ImageIcon(getClass
().
getResource("/demo/foto.jpg"));
jMenu1
= new javax.
swing.
JMenu(); jMenu2
= new javax.
swing.
JMenu(); jMenu1.setText("File");
jMenuBar1.add(jMenu1);
jMenu2.setText("Edit");
jMenuBar1.add(jMenu2);
setJMenuBar(jMenuBar1);
pack();
desk = new MyJDesktopPane();
frame.setSize(200, 200);
frame.setVisible(true);
desk.add(frame);
setContentPane(desk);
setLocationRelativeTo(null);
}
public static void main
(String args
[]) { public void run() {
new MyJFrame().setVisible(true);
}
});
}
}