JXImagePanel da biblioteca SwingX?

Salve galera

Seguinte, estou usando o componente JXImagePanel do SwingX para exibir uma imagem…Funciona blzinha, mas nao sei pq ele mantem a ultima imagem quando eu a troco. Eu preciso fechar o JFrame para ele exibir a nova imagem q troquei, parece q mantem em cache algo assim.

aqui como estou fazendo

public class AlteraCadastroDeProduto extends JDialog{
       private File imageFile;
 
       public AlteraCadastroDeProduto(){
             abreImagemCodBarraProduto();
       }
}

    public void imagemDefault(){
        ImageIcon imagem = new ImageIcon(getClass().getResource("/imagens/no_image.gif"));        
        imagePanel.setImage(imagem.getImage());
        imagePanel.setStyle(Style.SCALED);  
    }

 public void abreImagemCodBarraProduto(){
        //abre a imagem do produto referente ao codigo de barra 
        ImageIcon imagem = new ImageIcon("/IguanaSistemas/IguanaMarket/imagens/" + codBarra.getText().trim() + ".png"); 
        imagePanel.setImage(imagem.getImage());
        imagePanel.setStyle(Style.SCALED);  
    }


  public void trocaImagemDoProduto(){
       JFileChooser arquivo = new JFileChooser();  
       arquivo.setDialogTitle("Selecione a Imagem");  
       arquivo.setFileSelectionMode(JFileChooser.FILES_ONLY);  
       FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & PNG Images", new String[]{"jpg","png"});  
       arquivo.setFileFilter(filter);        
       arquivo.setAcceptAllFileFilterUsed(false);
       arquivo.setMultiSelectionEnabled(false);  
       imageFile = new File("user.dir");  
       int option = arquivo.showOpenDialog(this);  
       
       if(option == JFileChooser.APPROVE_OPTION) {
               imageFile = arquivo.getSelectedFile();
                              
               if(imageFile.getName().endsWith(".jpg") || imageFile.getName().endsWith(".png")){  
                   ImageIcon imagem = new ImageIcon(imageFile.getPath());             
                   imagePanel.setImage(imagem.getImage());
                   imagePanel.setStyle(Style.SCALED);                                        
               }else{
                   JOptionPane.showMessageDialog(null, "Arquivo não suportado", "Erro", JOptionPane.ERROR_MESSAGE);
                    imagemDefault();
               }               
       } 
    }


public void salvaImagem(){        
       try {
            if(imageFile != null){
                BufferedImage imagem = ImageIO.read(imageFile);                            
                ImageIO.write(imagem, "PNG", new File("/IguanaSistemas/IguanaMarket/imagens/" + codBarra.getText().trim() + ".png"));
            }else{
                BufferedImage imagem = ImageIO.read(getClass().getResource("/imagens/no_image.gif"));                            
                ImageIO.write(imagem, "PNG", new File("/IguanaSistemas/IguanaMarket/imagens/" + codBarra.getText().trim() + ".png"));
            }           
        } catch (IOException ex) {
               Logger.getLogger(AlteraCadastroDeProduto.class.getName()).log(Level.SEVERE, null, ex);
        }finally{
            imageFile = null;
        }
    }


//aqui onde salvo
public void alteraProduto(){
       salvaImagem();
       produto.update(produto);
}

Nao sei pq acontece isso, parece q a imagem fica em um cache sei la, e soh muda quando abro e fecho o sistema…

Alguma dica ?

obrigado

Chame novamente o método setImage do componente. Provavelmente ele faz uma cópia da imagem.

Opa Vini, obrigado pela atenção…Eu faco isso veja.

//aqui a tela que abre a tela de alteracao de produtos
public class ConsultaProdutos extends JDialog{
      public ConsultaProdutos(){
            
      }

      private void btnAlteraCadastroProdutoActionPerformed(ActionEvent e){
             AlteraCadastroDeProduto acp = new AlteraCadastroDeProduto(this, true);
             acp.setCodigoProduto(idProduto.getText());
             acp.setVisible(true);
      }
}



// tela de alteracao do produto
public class AlteraCadastroDeProduto extends JDialog{
        private File imageFile;
 
        public AlteraCadastroDeProduto(){
               
        }


    //aqui vai os metodos q postei no primeiro post.    


    public void setCodigoProduto(String idP){           
        //metodo que pega o id do produto, retorna uma lista, preenche os campos para alteracao e pega a imagem referente ao produto pelo codigo de barra
        Long id = Long.parseLong(idP);
        idProduto.setText(new FormataCodigos().retornaCodigoFormatado(id));        
        List<Produtos> lista = new ProdutosDAO().consultaProdutosPorCodigo(id);
        Double qDouble = new EstoqueDAO().qtdProdutoEstoque(id);
        if(lista.size() > 0){            
            for(Produtos p : lista){
                comboDisponivel.setSelectedItem(p.getDisponivel());
                produto.setText(p.getProduto());                                                
                codBarra.setText(p.getCodbarra().toString());
                descricao.setText(p.getDescricao());                
                comboUnidade.setSelectedItem(p.getUnidade().getUnidade());
                valorCusto.setText(new FormataMonetarios().retornaValorFormatado(p.getValorCusto()));
                valorVenda.setText(new FormataMonetarios().retornaValorFormatado(p.getValorVenda()));
                estoqueMaximo.setText(new FormataQuantidades().retornaValorFormatado(p.getEstoqueMax()));
                estoqueMinimo.setText(new FormataQuantidades().retornaValorFormatado(p.getEstoqueMin()));
                comboCategoria.setSelectedItem(p.getCategoria().getCategoria());
                estoqueAtual.setText(new FormataQuantidades().retornaValorFormatado(qDouble));
            } 
            abreImagemCodBarraProduto(); //aqui eu sempre abro a imagem 
        }        
    }

}

Nao sei pq acontece isso, parece q ta mantendo a imagem em cache…msm chamando o metodo novamente.

obrigado.

Já tentou chamar invalidate() e repaint() no seu painel após substituir a imagem?

Vini, eh muito estranho …Usei invalidate(), repaint(), revalidate() e nada ainda…affs !

obrigado novamente.

Ja tentei colocar setImage(null) etc…ainda mantem a ultima imagem ate q se feche o sistema…estranho d+. !

Por exemplo, se eu uso um dispose() pra fechar a tela onde atualizo a imagem e depois reabro ta la a ultima antes de trocar e nao a q troquei…Estranho d++.

obrigado.

O mais estranho é que olho na pasta a imagem q alterei ta la…Como falei, parece q o JXImagePanel mantem um cache sei la.

obrigado.