Trocar imagem num JLabel

Oi pessoal ,blz??

Eu tenho minha classe normal (que extende JFrame)… dentro desse JFrame eu tenho um JPanel… dentro do JPanel eu tenho um JLabel que contém uma imagem. Até aí, blz… o negócio agora, é que quero fazer uma atualização na interface, trocando a imagem toda vez que o usuário clica num botão… estou
fazendo da seguinte forma:

updateBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {

			imageLabel.setIcon(new ImageIcon( path ));		
			EditPatternUI.this.repaint();
		
			
			
		}
    }

);

Só que NADA ACONTECE! A imagem no JLabel permanece a mesma. Como devo fazer??

obrigado por quem puder ajudar

Vc sobescreveu o paintComponent?Alexandre, normalmente eu faço + ou - assim:

[code]
//método responsável por atualizar a imagem q é mostrada no rótulo
private void atualizaLabel(ImageIcon icon){

    img.setIcon(icon);
         
    if (icon != null) {
        img.setText(null);
        
        //caso não exista
    } else {
        img.setText("Imagem não disponível!");
    }

}

protected void paintComponent(Graphics g) {
 
      if (novaImagem != null) {
        int x = getWidth()/2 - novaImagem.getIconWidth()/2;
        int y = getHeight()/2 - novaImagem.getIconHeight()/2;

        if (y < 0) {
            y = 0;
        }

        if (x < 5) {
            x = 5;
        }
        novaImagem.paintIcon(this, g, x, y);
    }
} [/code]

E na hora de pegá-la:

[code]
imagem=new ImageIcon(file.getPath());//pega o caminho da imagem
novaImagem=new ImageIcon(imagem.getImage().//pega a imagem com novo tam
getScaledInstance(90, -1,
Image.SCALE_DEFAULT));

                    atualizaLabel(novaImagem);
                    repaint();   //atualiza o JLabel com a img selecionada
 [/code]

Funciona 100% :slight_smile: .

Cara sempre fiz assim e sempre funcionou

private Icon icons = new ImageIcon( img.gif ); . . . . public void actionPerformed(ActionEvent e) { label.setIcon( icon ); }

.

reizin, quando vc troca imagens vc pode ter q dar um “resize” em cada uma delas para caberem dentro da área delimitada para o JLabel que irá exibí-la(elas podem ter tam muito distintos tb).Para isso tem q se usar getScaledInstance() da forma como mostrei.

Pessoal, obrigado pela ajuda, mas nada disso funcionou… a imagem no JLabel continua a mesma

Epa!!!Como não funcionou???Bom, montei um exemplo rápido aqui, e de quebra vc ainda ganha como personalizar um JFileChooser…
veja as classes:

import javax.swing.*;
import java.beans.*;
import java.awt.*;
import java.io.File;

/* ImagePreview.java é um 1.4 exemplo usado pelo FileChooser dentro de MudaImagem **/
public class ImagePreview extends JComponent
                          implements PropertyChangeListener {
    ImageIcon thumbnail = null;
    File file = null;

    public ImagePreview(JFileChooser fc) {
        setPreferredSize(new Dimension(100, 50));
        fc.addPropertyChangeListener(this);
    }

    public void loadImage() {
        if (file == null) {
            thumbnail = null;
            return;
        }

        //Don't use createImageIcon (which is a wrapper for getResource)
        //because the image we're trying to load is probably not one
        //of this program's own resources.
        ImageIcon tmpIcon = new ImageIcon(file.getPath());
        if (tmpIcon != null) {
            if (tmpIcon.getIconWidth() > 90) {
                thumbnail = new ImageIcon(tmpIcon.getImage().
                                          getScaledInstance(90, -1,
                                                      Image.SCALE_DEFAULT));
            } else { //sem necessidade de miniaturizar
                thumbnail = tmpIcon;
            }
        }
    }

    public void propertyChange(PropertyChangeEvent e) {
        boolean update = false;
        String prop = e.getPropertyName();

        //Se o diretório muda,não mostra a imagem.
        if (JFileChooser.DIRECTORY_CHANGED_PROPERTY.equals(prop)) {
            file = null;
            update = true;

        //Se um arquivo é seleciodado, find out which one.
        } else if (JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(prop)) {
            file = (File) e.getNewValue();
            update = true;
        }

        //Atualiza o preview correspondente.
        if (update) {
            thumbnail = null;
            if (isShowing()) {
                loadImage();
                repaint();
            }
        }
    }

    protected void paintComponent(Graphics g) {
        if (thumbnail == null) {
            loadImage();
        }
        if (thumbnail != null) {
            int x = getWidth()/2 - thumbnail.getIconWidth()/2;
            int y = getHeight()/2 - thumbnail.getIconHeight()/2;

            if (y < 0) {
                y = 0;
            }

            if (x < 5) {
                x = 5;
            }
            thumbnail.paintIcon(this, g, x, y);
        }
    }//fim do método paintComponent()
 }
import java.io.File;
import javax.swing.ImageIcon;

/* Utils.java is a 1.4 example */
public class Utils {
    public final static String jpeg = "jpeg";
    public final static String jpg = "jpg";
    public final static String gif = "gif";
    public final static String tiff = "tiff";
    public final static String tif = "tif";
    public final static String png = "png";

    /*
     * Pega a extensão do Arquivo.
     */
    public static String getExtension(File f) {
        String ext = null;
        String s = f.getName();
        int i = s.lastIndexOf('.');

        if (i > 0 &&  i < s.length() - 1) {
            ext = s.substring(i+1).toLowerCase();
        }
        return ext;
    }

    /** Returna um ImageIcon, ou null se o caminho é inválido */
    protected static ImageIcon createImageIcon(String path) {
        java.net.URL imgURL = Utils.class.getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        } else {
            System.err.println("O arquivo não pode ser encontrado: " + path);
            return null;
        }
    }
}
import java.io.File;
import javax.swing.*;
import javax.swing.filechooser.*;

/* ImageFileView.java is a 1.4 example used pelo FileChooser da classe MudaImagem. */
public class ImageFileView extends FileView {
    ImageIcon jpgIcon = Utils.createImageIcon("imagens/jpgIcon.gif");
    ImageIcon gifIcon = Utils.createImageIcon("imagens/gifIcon.gif");
    ImageIcon tiffIcon = Utils.createImageIcon("imagens/tiffIcon.gif");
    ImageIcon pngIcon = Utils.createImageIcon("imagens/pngIcon.png");

    public String getName(File f) {
        return null; //let the L&F FileView figure this out
    }

    public String getDescription(File f) {
        return null; //let the L&F FileView figure this out
    }

    public Boolean isTraversable(File f) {
        return null; //let the L&F FileView figure this out
    }

    public String getTypeDescription(File f) {
        String extension = Utils.getExtension(f);
        String type = null;

        if (extension != null) {
            if (extension.equals(Utils.jpeg) ||
                extension.equals(Utils.jpg)) {
                type = "JPEG Image";
            } else if (extension.equals(Utils.gif)){
                type = "GIF Image";
            } else if (extension.equals(Utils.tiff) ||
                       extension.equals(Utils.tif)) {
                type = "TIFF Image";
            } else if (extension.equals(Utils.png)){
                type = "PNG Image";
            }
        }
        return type;
    }

    public Icon getIcon(File f) {
        String extension = Utils.getExtension(f);
        Icon icon = null;

        if (extension != null) {
            if (extension.equals(Utils.jpeg) ||
                extension.equals(Utils.jpg)) {
                icon = jpgIcon;
            } else if (extension.equals(Utils.gif)) {
                icon = gifIcon;
            } else if (extension.equals(Utils.tiff) ||
                       extension.equals(Utils.tif)) {
                icon = tiffIcon;
            } else if (extension.equals(Utils.png)) {
                icon = pngIcon;
            }
        }
        return icon;
    }
}
import java.io.File;
import javax.swing.*;
import javax.swing.filechooser.*;

/* ImageFilter.java is a 1.4 example used by MudaImagem */
public class ImageFilter extends FileFilter {

    //Accept all directories and all gif, jpg, tiff, or png files.
    public boolean accept(File f) {
        if (f.isDirectory()) {
            return true;
        }

        String extension = Utils.getExtension(f);
        if (extension != null) {
            if (extension.equals(Utils.tiff) ||
                extension.equals(Utils.tif) ||
                extension.equals(Utils.gif) ||
                extension.equals(Utils.jpeg) ||
                extension.equals(Utils.jpg) ||
                extension.equals(Utils.png)) {
                    return true;
            } else {
                return false;
            }
        }

        return false;
    }

    //The description of this filter
    public String getDescription() {
        return "Apenas Imagens";
    }
}

E finalmente a classe para visualizar:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

import javax.swing.JButton; 
import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JInternalFrame; 
import javax.swing.JPanel; 
import javax.swing.event.InternalFrameEvent; 
import javax.swing.event.InternalFrameListener;
import javax.swing.filechooser.*; 


import java.io.*;

public class MudaImagem extends JFrame {
  private JPanel panel1,panel2;
  private JLabel labelFoto;
  private JButton buttonFoto;
  private ImageIcon imagem,novaImagem;
  private JFileChooser fc;
  
  public MudaImagem(){
  	super("Muda Imagens em JLabel");
  	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  	iniciarComponentes();
  	
  	setSize(340,200);
  	setLocationRelativeTo(null);
  	 setVisible(true);
  }
  
  
  public void iniciarComponentes(){
  	panel1=new JPanel();
  	panel1.setLayout(new FlowLayout(FlowLayout.CENTER));
      	
  	labelFoto=new JLabel();
  	labelFoto.setBorder(BorderFactory.createEtchedBorder());
  	labelFoto.setHorizontalAlignment(JLabel.CENTER);
  	labelFoto.setPreferredSize(new Dimension(177,122+10)); 
  	panel1.add(labelFoto);
  	  	this.add(panel1,BorderLayout.NORTH);
  	  	
  	  	panel2=new JPanel();
  	  	panel2.setLayout(new FlowLayout(FlowLayout.RIGHT));  
  	  
  	  	buttonFoto=new JButton("Inserir Imagem");
  	  	panel2.add(buttonFoto);
  	  	this.add(panel2,BorderLayout.SOUTH);
  	  	  	
  	    adicionarEvento();
  }
  
  private void atualizaLabel(ImageIcon icon){
   	    
   	    labelFoto.setIcon(icon);
   	         
        if (icon != null) {
            labelFoto.setText(null);
            
            //repaint();
        } else {
            labelFoto.setText("Imagem não disponível!");
        }
   	
   }
   
  
    protected void paintComponent(Graphics g) {
     
          if (novaImagem != null) {
            int x = getWidth()/2 - novaImagem.getIconWidth()/2;
            int y = getHeight()/2 - novaImagem.getIconHeight()/2;

            if (y < 0) {
                y = 0;
            }

            if (x < 5) {
                x = 5;
            }
            novaImagem.paintIcon(this, g, x, y);
        }
    }  
  
  private void adicionarEvento() { 
      //addInternalFrameListener(this);//adiciona o ouvinte ao objeto da classe 
      
      //**********Classe Ouvinte do botão insereFoto****************************************
      buttonFoto.addActionListener(
      	 new ActionListener() {
      	    public void actionPerformed(ActionEvent evt) {
      	     
      	     if (fc == null) {
                    fc = new JFileChooser();

	           //Adiciona um filtro de arquivos próprio(Apenas Imagens) e desabilita  
	           //o padrão (Aceitar Todos os arquivos) 
                fc.addChoosableFileFilter(new ImageFilter());
                fc.setAcceptAllFileFilterUsed(false);

	           //Adiciona ícones padrão para diferentes tipos de arquivos(JPEG,GIF..).
                fc.setFileView(new ImageFileView());

	           //Adiciona a janela de preview(visualização de imagem).
                fc.setAccessory(new ImagePreview(fc));
                       
                                                        }
                             
                 //Mostra o FileChooser.
                int returnVal = fc.showDialog(MudaImagem.this,"Anexar"); 
                
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                	File file = fc.getSelectedFile();
                	 imagem=new ImageIcon(file.getPath());//pega o caminho da imagem
               	     novaImagem=new ImageIcon(imagem.getImage().//pega a imagem com novo tam
                                          getScaledInstance(90, -1,
                                                      Image.SCALE_DEFAULT));
                      
                        atualizaLabel(novaImagem);
                        repaint();   //atualiza o JLabel com a img selecionada
                	 
                		}            
      	     		 
      	        //Limpa o File Chooser para a próxima vez que for mostrado .
                fc.setSelectedFile(null);		 
      	     		 
      	                                                  }//fim do actionPerformed
      	    }
      	 );//fim da inner class do Listener    
      
   }//fim do método adicionarEvento() 
   
   public static void main(String args[]){
   	 new MudaImagem();
   } 	
	
} 

OBS.:Livre adaptação minha do exemplo da sun de JFileChooser2.java

Nota:Tô bonzinho hoje! :lol:

Amigo, blz??? Valeu pela ajuda… mas seu código está muito grande… entao achei melhor mandar o meu p/ vc dar uma olhada… é coisa rápida.
O negócio é que ele não muda a imagem no JLabel após eu clicar no botão… um abraço

import java.awt.;
import java.awt.event.
;
import javax.swing.;
import java.io.
;

public class EditPatternUI extends JFrame {

private Container c;

private JLabel imageLabel;

private JButton updateBtn;

private String path;
private Icon imageDiagram;

public EditPatternUI() {
	super("Edit Analysis Pattern");
	
	c = getContentPane();	
    c.setLayout(null);
  
    File fileDirAux = new File("");
	path = fileDirAux.getAbsolutePath();
			 
	imageDiagram = new ImageIcon( path + "\\temp.gif");

System.out.println("veja: " + path);
imageLabel = new JLabel(imageDiagram);

	JPanel panel1 = new JPanel();
	
   // adiciona imagem ao painel1		
    panel1.add(imageLabel);
    	    
    
       // esse botao dispara o evento de trocar a imagem
    updateBtn = new JButton("Update Image");
    updateBtn.addActionListener(new ActionListener() {        	
		public void actionPerformed(ActionEvent e) {
			
			ImageIcon ig = new ImageIcon(path +
			"\\outra.gif"); // pega a outra imagem do mesmo diretorio	
			
			 imageDiagram=ig;
			imageLabel.setIcon(ig);		
			imageLabel.repaint();
			EditPatternUI.this.repaint();
		
			
			
		}
    }
    );
    c.add(updateBtn);
    updateBtn.setBounds(310, 580, 150, 25);
    
  // não há necessidade de redimensionamento da imagem, se ela for maior, aparece a barra de rolagem
   
	JScrollPane scroller = new JScrollPane(panel1);
	scroller.setBounds(10, 60, 700, 500);
	
	c.add(scroller, BorderLayout.CENTER);
					
	
	addWindowListener(new WindowAdapter() {
		public void windowClosing(WindowEvent e) {
			
			dispose();
		}
	});
	
	
	setResizable(false);
	setSize(1000, 725);
	setVisible(true);
}


/**
 * @param args
 */
public static void main(String[] args) {
	// TODO Auto-generated method stub
	EditPatternUI app = new EditPatternUI();		
	
}

}

Cara, esse seu código funciona, nem precisa dessa linha:
imageLabel.repaint(); pq vc pôs aquela con referência a classe.
Algumas dicas:não use null layout.Apresenta diferentes comportamentos em diferentes sistemas.
Vc extende JFrame, esqueça windowclosing e use apenas:

Valeu pelas dicas! Não é que esse código q te mandei funciona mesmo… o estranho é q na minha aplicação não está funcionando… nao entendo pq…

cara, achei o problema! é que em meu projeto eu estava utilizando o mesmo nome de figura… antes de fazer a atualização, eu gerava uma outra figura em cima da anterior (com o mesmo nome) e na hora de atualizar a figura, ele nao atualizava pq estava com o mesmo nome… sabe como posso forçar ele a fazer a atualização??