Foros del Web » Programación para mayores de 30 ;) » Java »

Agregar imagen a JPanel

Estas en el tema de Agregar imagen a JPanel en el foro de Java en Foros del Web. Buenas Tardes... Tengo un pequeño problema en el tratado de imagenes en java, deseo agregar una imagen en una clase para que dicha imagen sea ...
  #1 (permalink)  
Antiguo 28/10/2009, 16:17
Avatar de gasoft  
Fecha de Ingreso: abril-2009
Mensajes: 68
Antigüedad: 15 años
Puntos: 3
Pregunta Agregar imagen a JPanel

Buenas Tardes...

Tengo un pequeño problema en el tratado de imagenes en java, deseo agregar una imagen en una clase para que dicha imagen sea utilizada en distintos JFrame. Mi primer problema esta al hacer visible la imagen .


Código:
// Importo librerias necesarias para el tratado de imagenes.
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.Image; 

// Declaro un objeto de tipo Imagen el cual contentra la ubicacion de la imagen (bueno eso creo :p)
Image miImagen = (Toolkit.getDefaultToolkit()).getImage("/img/precaucion.png");


// // Se sobrecarga el método para pintar la imagen
public void paint(Graphics g)
{
g.drawImage(miImagen, 100, 100, null);

}

Mi pregunta es..... como lo hago visible por medio de un boton :S


Muchas Gracias por sus posibles respuestas :D

Última edición por gasoft; 28/10/2009 a las 16:24 Razón: jeje se me olvido agradecer :)
  #2 (permalink)  
Antiguo 29/10/2009, 10:19
Avatar de gasoft  
Fecha de Ingreso: abril-2009
Mensajes: 68
Antigüedad: 15 años
Puntos: 3
Respuesta: Agregar imagen a JPanel

Alguna ayuda ? por favor
  #3 (permalink)  
Antiguo 29/10/2009, 12:29
Avatar de 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

Cita:
Iniciado por gasoft Ver Mensaje
... Mi pregunta es..... como lo hago visible por medio de un boton :S ...
Al presionar un botón, o hacerla visible dentro de un botón.
  • ¿Como la hago visible al presionar un botón?
  • ¿Como la hago visible dentro de un botón?

Si la deseas hacer visible al presionar un botón (usando el método paint()), podrías usar una bandera que cambia a 'true' y llama a repaint() cuando presionas el botón (implementado en el actionPerformed() del botón).

Si deseas hacerla visible dentro de un botón, existe un constructor que acepta un ImageIcon, o el método setIcon(). Posteriormente puedes hacer visible o invisible el botón con setVisible().

El componente JLabel también acepta desplegar una imagen.

Cita:
Iniciado por gasoft Ver Mensaje
Código:
// Importo librerias necesarias para el tratado de imagenes.
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.Image; 

// Declaro un objeto de tipo Imagen el cual contentra la ubicacion de la imagen (bueno eso creo :p)
Image miImagen = (Toolkit.getDefaultToolkit()).getImage("/img/precaucion.png");
bool flag = false;

// // Se sobrecarga el método para pintar la imagen
public void paint(Graphics g)
{
if (flag)
g.drawImage(miImagen, 100, 100, null);
super.paint(g);
}
Saludos,
  #4 (permalink)  
Antiguo 29/10/2009, 12:56
Avatar de gasoft  
Fecha de Ingreso: abril-2009
Mensajes: 68
Antigüedad: 15 años
Puntos: 3
Respuesta: Agregar imagen a JPanel

Gracias HackmanC por tu ayuda

Bueno ando haciendo el evento para el boton... pero pues no te entiendo lo otro :S. Perdon por mi ignorancia.


Código:
 private void BotonMostarImagenActionPerformed(java.awt.event.ActionEvent evt) {                                         
        boolean flag = true;
        repaint();
       
    }
  #5 (permalink)  
Antiguo 29/10/2009, 15:48
Avatar de 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,

Cita:
Iniciado por gasoft Ver Mensaje
Código:
 private void BotonMostarImagenActionPerformed(java.awt.event.ActionEvent evt) {                                         
        flag = true;
        repaint();
       
    }
La variable flag la tienes que declarar a nivel de la clase, en este evento solamente modificarla.

Saludos,
  #6 (permalink)  
Antiguo 29/10/2009, 20:21
Avatar de gasoft  
Fecha de Ingreso: abril-2009
Mensajes: 68
Antigüedad: 15 años
Puntos: 3
Respuesta: Agregar imagen a JPanel

Hola,

La variable flag esta declarada en el metodo paint()

Amigo HackmanC, ¿Que mas debo de hacer para poder visualizar la imagen?

Código:
// Importo librerias necesarias para el tratado de imagenes.
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.Image; 

// Declaro un objeto de tipo Imagen el cual contentra la ubicacion de la imagen (bueno eso creo :p)
Image miImagen = (Toolkit.getDefaultToolkit()).getImage("/img/precaucion.png");
boolean flag = false;

//Evento de Boton para mostrar la imagen. 
private void BotonMostarImagenActionPerformed(java.awt.event.ActionEvent evt) {                                         
        flag = true;
        repaint();
       
    }

// // Se sobrecarga el método para pintar la imagen
public void paint(Graphics g)
{
if (flag)
g.drawImage(miImagen, 100, 100, null);
super.paint(g);
}
gracias ,
  #7 (permalink)  
Antiguo 30/10/2009, 01:44
Avatar de 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,

Supuse que ya podías visualizar la imagen y solamente querías ocultarla y mostrarla al presionar un botón. Actualmente puedes obtener muchos mejores resultados usando un JLabel que incluya la imagen, un JButton que incluya la imagen, o cargarla con métodos de ImageIO u otros.

Código Java:
Ver original
  1. package org;
  2.  
  3. import java.awt.Dimension;
  4. import java.awt.Graphics;
  5. import java.awt.Image;
  6. import java.awt.Toolkit;
  7. import java.awt.image.ImageObserver;
  8.  
  9. public class Main extends javax.swing.JFrame {
  10.  
  11.     private javax.swing.JButton jButton1;
  12.     Panel p = new Panel();
  13.     Image miImagen = Toolkit.getDefaultToolkit().getImage("/nuevhh4.jpg");
  14.     boolean flag = true;
  15.  
  16.     public Main() {
  17.         setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
  18.  
  19.         jButton1 = new javax.swing.JButton();
  20.         jButton1.setText("jButton1");
  21.         jButton1.addActionListener(new java.awt.event.ActionListener() {
  22.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  23.                 jButton1ActionPerformed(evt);
  24.             }
  25.         });
  26.         getContentPane().add(jButton1, java.awt.BorderLayout.LINE_END);
  27.  
  28.         pack();
  29.  
  30.         prepareImage(miImagen, p);
  31.         getContentPane().add(p, java.awt.BorderLayout.CENTER);
  32.  
  33.         setSize(new Dimension(400, 400));
  34.         setLocationRelativeTo(null);
  35.     }
  36.  
  37.     private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
  38.         flag = !flag;
  39.         repaint();
  40.     }
  41.  
  42.     public static void main(String args[]) {
  43.         java.awt.EventQueue.invokeLater(new Runnable() {
  44.             public void run() {
  45.                 new Main().setVisible(true);
  46.             }
  47.         });
  48.     }
  49.  
  50.     private class Panel extends javax.swing.JPanel {
  51.         @Override
  52.         public void paint(Graphics g) {
  53.             if (flag) {
  54.                 g.drawImage(miImagen, 0, 0, getWidth(), getHeight(), this);
  55.             }
  56.         }
  57.         @Override
  58.         public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
  59.             if ((infoflags & ImageObserver.ALLBITS) != 0) {
  60.                 repaint();
  61.                 return false;
  62.             }
  63.             return true;
  64.         }
  65.     }
  66. }

Saludos,

ps:

De cualquier forma el método getImage() funciona en base a como se hacían las aplicaciones para obtener imágenes hace buen tiempo, en forma asíncrona y por medio de un ImageObserver. (Y ya se me había olvidado casi completamente, inclusive creo que no era exactamente igual que este ejemplo, desde Symantec Java Cafe).
  #8 (permalink)  
Antiguo 30/10/2009, 09:42
Avatar de gasoft  
Fecha de Ingreso: abril-2009
Mensajes: 68
Antigüedad: 15 años
Puntos: 3
Respuesta: Agregar imagen a JPanel

Hola amigo HackmanC

he hecho lo que me has indicado pero cuando doy clic sobre el boton no pasa nada :(.

Código Java:
Ver original
  1. package imagen;
  2.  
  3.  
  4. import java.awt.Dimension;
  5. import java.awt.Graphics;
  6. import java.awt.Image;
  7. import java.awt.Toolkit;
  8. import java.awt.image.ImageObserver;
  9.  
  10.  
  11. /**
  12.  *
  13.  * @author R2D2
  14.  */
  15.  
  16. public class Ventana extends javax.swing.JFrame {
  17.  
  18.     Image miImagen = Toolkit.getDefaultToolkit().getImage("/recursos/imagen.jpg");
  19.     boolean flag = true;
  20.  
  21.  
  22.     public Ventana() {
  23.         initComponents();
  24.  
  25.         prepareImage(miImagen,this);
  26.  
  27.         setLocationRelativeTo(null);
  28.  
  29.         setResizable(false);
  30.  
  31.          
  32.     }
  33.  
  34.    
  35.     @SuppressWarnings("unchecked")
  36.     // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
  37.     private void initComponents() {
  38.  
  39.         BotonMostarImagen = new javax.swing.JButton();
  40.  
  41.         setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
  42.  
  43.         BotonMostarImagen.setText("Boton");
  44.         BotonMostarImagen.addActionListener(new java.awt.event.ActionListener() {
  45.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  46.                 BotonMostarImagenActionPerformed(evt);
  47.             }
  48.         });
  49.  
  50.         javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
  51.         getContentPane().setLayout(layout);
  52.         layout.setHorizontalGroup(
  53.             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  54.             .addGroup(layout.createSequentialGroup()
  55.                 .addGap(159, 159, 159)
  56.                 .addComponent(BotonMostarImagen)
  57.                 .addContainerGap(180, Short.MAX_VALUE))
  58.         );
  59.         layout.setVerticalGroup(
  60.             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  61.             .addGroup(layout.createSequentialGroup()
  62.                 .addGap(134, 134, 134)
  63.                 .addComponent(BotonMostarImagen)
  64.                 .addContainerGap(143, Short.MAX_VALUE))
  65.         );
  66.  
  67.         pack();
  68.     }// </editor-fold>//GEN-END:initComponents
  69.  
  70.     private void BotonMostarImagenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BotonMostarImagenActionPerformed
  71.  
  72.         flag = !flag;
  73.         repaint();
  74.     }//GEN-LAST:event_BotonMostarImagenActionPerformed
  75.  
  76.    
  77.     public static void main(String args[]) {
  78.         java.awt.EventQueue.invokeLater(new Runnable() {
  79.             public void run() {
  80.                 new Ventana().setVisible(true);
  81.             }
  82.         });
  83.     }
  84.  
  85.  
  86.  
  87. @Override
  88. public void paint(Graphics g)
  89. {
  90.             if (flag) {
  91.                 g.drawImage(miImagen, 100, 100, getWidth(), getHeight(), this);
  92.                
  93.             }
  94.  
  95. }
  96.  
  97. @Override
  98. public boolean imageUpdate(Image miImagen, int infoflags, int x, int y, int width, int height) {
  99.             if ((infoflags & ImageObserver.ALLBITS) != 0) {
  100.                repaint();
  101.                 return false;
  102.             }
  103.             return true;
  104.         }
  105.  
  106.     // Variables declaration - do not modify//GEN-BEGIN:variables
  107.     private javax.swing.JButton BotonMostarImagen;
  108.     // End of variables declaration//GEN-END:variables
  109.  
  110.  
  111.  
  112. }


La verdad no se que me falta.. .

Mira por ejemplo en la linea 98 ; que parametros debo de pasarle.. ya que cuando le paso parametros... por ejemplo x ,y me saca error. :(
  #9 (permalink)  
Antiguo 30/10/2009, 23:24
Avatar de 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,

El código que mostraste creo que no va a funcionar porque estas usando un GroupLayout, en otros casos cuando se usa un setLayout(null) funciona pintar sobre el fondo porque no hay Layout. (Aunque si llamas al método super.paint(g) en paint() si muestra la imagen correctamente).

No estoy seguro que deseas hacer, pero en ese caso creo que lo mejor es usar otro método para cargas la imágenes, y si deseas mostrar una imagen de fondo usar un Layered Pane.

No es aconsejable usar un Layout Null puesto que se requiere de mucha práctica para hacerlo funcionar correctamente, tampoco es aconsejable mezclar cualquier Layout (GroupLayout) con el método paint() por el mismo motivo.

Cita:
Mira por ejemplo en la linea 98 ...
Ese método nunca hay que llamarlo, es un método tipo callback que se ejecuta al llamar este otro método : prepareImage(miImagen, this);


Realmente no puedo corregir tu código para que funcione bien, siempre se va a borrar la imagen o no va a desplegar el botón, posiblemente alguien con mayor conocimiento en Swing pueda ayudarte más.

Saludos,
  #10 (permalink)  
Antiguo 04/11/2009, 11:26
Avatar de gasoft  
Fecha de Ingreso: abril-2009
Mensajes: 68
Antigüedad: 15 años
Puntos: 3
Respuesta: Agregar imagen a JPanel

Amigo HackmanC, muchas gracias por tu ayuda de verdad fuistes muy paciente y intentastes guiarme. pues si puedes recomendar un metodo de insertar una imagen pues seria genial . :)
  #11 (permalink)  
Antiguo 05/11/2009, 15:52
Avatar de 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,
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:28.