Ver Mensaje Individual
  #6 (permalink)  
Antiguo 20/09/2010, 23:07
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: AYUDAAAAAAAAA!! Jframe con imagen de fondo!

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 original
  1. private class MyJDesktopPane extends javax.swing.JDesktopPane {
  2.         @Override
  3.         protected void paintComponent(java.awt.Graphics g) {
  4.             super.paintComponent(g);
  5.             g.drawImage(fondo.getImage(), 0, 0, getWidth(), getHeight(), null);
  6.         }
  7.     }

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 original
  1. desk = new MyJDesktopPane();
  2.         frame = new javax.swing.JInternalFrame("Hello World", true);
  3.         frame.setSize(200, 200);
  4.         frame.setVisible(true);
  5.         desk.add(frame);
  6.         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 original
  1. package demo;
  2.  
  3. public class MyJFrame extends javax.swing.JFrame {
  4.  
  5.     private javax.swing.JMenu jMenu1;
  6.     private javax.swing.JMenu jMenu2;
  7.     private javax.swing.JMenuBar jMenuBar1;
  8.  
  9.     javax.swing.ImageIcon fondo;
  10.     javax.swing.JInternalFrame frame;
  11.     MyJDesktopPane desk;
  12.  
  13.     private class MyJDesktopPane extends javax.swing.JDesktopPane {
  14.         @Override
  15.         protected void paintComponent(java.awt.Graphics g) {
  16.             super.paintComponent(g);
  17.             g.drawImage(fondo.getImage(), 0, 0, getWidth(), getHeight(), null);
  18.         }
  19.     }
  20.  
  21.     public MyJFrame() {
  22.         fondo = new javax.swing.ImageIcon(getClass().getResource("/demo/foto.jpg"));
  23.  
  24.         jMenuBar1 = new javax.swing.JMenuBar();
  25.         jMenu1 = new javax.swing.JMenu();
  26.         jMenu2 = new javax.swing.JMenu();
  27.         jMenu1.setText("File");
  28.         jMenuBar1.add(jMenu1);
  29.         jMenu2.setText("Edit");
  30.         jMenuBar1.add(jMenu2);
  31.         setJMenuBar(jMenuBar1);
  32.  
  33.         setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
  34.         pack();
  35.  
  36.         desk = new MyJDesktopPane();
  37.         frame = new javax.swing.JInternalFrame("Hello World", true);
  38.         frame.setSize(200, 200);
  39.         frame.setVisible(true);
  40.         desk.add(frame);
  41.         setContentPane(desk);
  42.         setSize(new java.awt.Dimension(640, 480));
  43.         setLocationRelativeTo(null);
  44.     }
  45.  
  46.     public static void main(String args[]) {
  47.         java.awt.EventQueue.invokeLater(new Runnable() {
  48.             public void run() {
  49.                 new MyJFrame().setVisible(true);
  50.             }
  51.         });
  52.     }
  53.  
  54. }