Problema cargar foto JPANEL

Iniciado por ivanrodas, 28 Mayo 2014, 12:13 PM

0 Miembros y 1 Visitante están viendo este tema.

ivanrodas

Hola, soy yo otra vez , vais a pensar que soy un patán con esto .... jaja pero me surgió un problema muy extraño.

Tengo un jpanel para mostrar una foto a demas de unos atributos, el jpanel lo cambie por una etiqueta y me pasaba el mismo problema


Tengo 4 metodos diferentes:

Uno se llama preparar(objt v);
le pasamos un objeto y el metodo coge todas las propiedades del objeto y las pinta en las diferentes JtextLabeL del Jpanel, entre otras captura una imagen del objeto y la pasa de la siguiente manera:

Código (java) [Seleccionar]

*
*
setjPanelFoto(v.getFotografia());
*
*

me llama a ese metodo que es el siguiente

Código (java) [Seleccionar]
    public void setjPanelFoto(ImageIcon x) {
        this.jPanelFoto.getGraphics().drawImage(x.getImage(), WIDTH, HEIGHT, 150, 150, this);

    }


bien el problema esta aqui:

cuando me meto por primera vez en esa ventana , me llama al método ConsultarTodo(); que este lo que hace es recuperar el primer objeto de una Array y se lo pasa al método preparar(obj);

me pinta la ventana con todos los datos exceptuando la foto , me he fijado que en un momento determinado me pinta la foto pero luego al cargar y pintar todo los datos me la borra.... , luego tengo un botón llamado siguiente . lo que hace es recuperar el objeto siguiente de la array y llamar a preparar(obj) con el nuevo objeto , pues aquí me presenta bien todos los campos , incluida la foto..., tengo otro botón que es Anterior, que hace lo contrario , recupera el objeto anterior... y me funciona también correctamente.


Migugami

Código (=java) [Seleccionar]

@Override
protected void paintComponent(Graphics g) {
     super.paintComponent(g);
     g.drawImage(image, 0, 0, null);     
}


Recuerda, para dibujar cualquier cosa en un contenedor de JPanel, debes de usar el método paintComponent, que será llamado automáticamente cada vez que hayan cambios en el JPanel (se mueva, etc), así que debes dibujar tu imagen en éste método para que la imagen sea visible todo el tiempo en el JPanel.

ivanrodas

#2
pero mi imagen esta guardada como ImagenIcon , le tengo que realizar un cast para poder usarla en ese metodo no?

lo siento pero no me entero, he puesto ese código , interpreto que en image tendré que poner la imagen , pero en Graphics no se que objeto pasarle.

gracias por la ayuda

Migugami

1) Crea una clase que herede de JPanel (ésta clase será el panel con el fondo) y Guardas la imagen en un objeto Image:

Código (=java) [Seleccionar]

Image fondo = new ImageIcon(
   getClass().getResource("fondo.jpg")
).getImage();


2) Lde implementar los controles y todo lo que desees, sobreescribes el método paintComponent.

Código (=java) [Seleccionar]

@Override
protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(fondo, 0, 0, null);     
}


NOTA: No necesitas llamar al método paintComponent explícitamente, ya que éste es llamado automáticamente por JPanel cada vez que el estado del JPanel cambia (cuando se mueve, se refresca la pantalla, etc). En casos es necesario llamarlo explícitamente, esto se hace con el método repaint.

Código (=java) [Seleccionar]

public class PanelFondo extends JPanel {
Image fondo;

public PanelFondo() {
this.setPreferredSize(500,600);
this.add(crearFondo());
}

private void crearFondo() {
fondo = new ImageIcon(
    getClass().getResource("fondo.jpg")
).getImage();
}

// ESTE METODO ES LLAMADO AUTOMATICAMENTE POR JPANEL PARA
// PINTAR LA UI, INCLUIDA LA IMAGEN DE FONDO
@Override
protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(fondo, 0, 0, null);     
}

}