Ver Mensaje Individual
  #11 (permalink)  
Antiguo 05/11/2009, 15:52
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: Agregar imagen a JPanel

Hola,

Tendrías que crear dos clases, un JPanel y un JFrame independientes.

En la clase Panel agregué un BufferedImage y el flag, en el constructor se lee el archivo del contenedor .JAR, y dentro del jar está la imágen (background.png), la imagen tiene que estar ubicada en el mismo directorio donde está esta clase. Si no quieres incluir el archivo en el contenedor .JAR, puedes usar el segundo método (el que está comentado) que lo lee de un archivo en el disco duro que pude estar en cualquier lugar (donde Java lo pueda encontrar ).

Código Java:
Ver original
  1. package org;
  2. // import's
  3. public class Panel extends javax.swing.JPanel {
  4.  
  5.     private BufferedImage bi = null;
  6.     private boolean flag = true;
  7.  
  8.     public Panel() {
  9.         try {
  10.             bi = ImageIO.read(getClass().getResource("/org/background.png"));
  11.             // bi = ImageIO.read(new File("C:\\background.png"));
  12.         } catch (IOException ex) {
  13.             System.err.println(ex.toString());
  14.         }
  15.         initComponents();
  16.     }
  17.  
  18.     @Override
  19.     public void paintComponent(Graphics g) {
  20.         super.paintComponent(g);
  21.         if (flag && bi != null) {
  22.             g.drawImage(bi, 0, 0, this.getWidth(), this.getHeight(), null);
  23.         }
  24.     }
  25.  
  26. ....

Dentro del mismo Panel agregas el botón JButton y lo colocas en cualquier lugar. Ademas dentro del ActionPerformed del botón agregas el flag.

Código Java:
Ver original
  1. private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                        
  2.         flag = !flag;
  3.         repaint();
  4.     }

Ahora creas la segunda clase 'Ventana' y agregas el Panel anterior adentro, primero compilas (generar) el proyecto en NetBeans y después arrastaras desde la paleta 'Proyectos', el icono de Panel.java sobre el JFrame Ventana que tienes abierto en el editor.

Dejo los 2 códigos para que puedas verlos detenidamente,

Panel.java
Código:
package org;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Panel extends javax.swing.JPanel {

    private BufferedImage bi = null;
    private boolean flag = true;

    public Panel() {
        try {
            bi = ImageIO.read(getClass().getResource("/org/background.png"));
            // bi = ImageIO.read(new File("C:\\background.png"));
        } catch (IOException ex) {
            System.err.println(ex.toString());
        }
        initComponents();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (flag && bi != null) {
            g.drawImage(bi, 0, 0, this.getWidth(), this.getHeight(), null);
        }
    }


    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jButton1 = new javax.swing.JButton();

        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(162, 162, 162)
                .addComponent(jButton1)
                .addContainerGap(165, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(134, 134, 134)
                .addComponent(jButton1)
                .addContainerGap(143, Short.MAX_VALUE))
        );
    }// </editor-fold>                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        flag = !flag;
        repaint();
    }                                        

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    // End of variables declaration                   

}
Ventana.java
Código:
package org;

public class Ventana extends javax.swing.JFrame {

    public Ventana() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        panel1 = new org.Panel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(panel1, javax.swing.GroupLayout.DEFAULT_SIZE, 420, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(panel1, javax.swing.GroupLayout.DEFAULT_SIZE, 322, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Ventana().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private org.Panel panel1;
    // End of variables declaration

}
De esta forma puedes tener una imágen de fondo y poner los controles sobre el Panel usando 'GroupLayout'. Ya está probado.

Saludos,