Problema no registro de imagens com BufferedImage

Pessoal, estou com um problema numa aplicação Java que estou desenvolvendo, vou tentar explicar simplificadamente:

1 - No meu código, desenvolvi um cadastro de pessoas que inclui uma imagem da pessoa que está sendo cadastrada. Estou utilizando um JFileChooser que permite escolher o arquivo de imagem, posteriormente setada no icone de um JLabel da aplicação. Essa mesma imagem é também gravada numa pasta do projeto, através do uso do ImageIO.write.

2 - Também foi implementado no código uma forma de atualizar o cadastro da pessoa, escolhendo uma nova imagem para seu perfil. Novamente utilizo o ImageIO.write que grava a nova imagem escolhida no JFileChooser na mesma origem da pasta do projeto, substituindo a imagem antiga.

3 - O problema é que, quando faço uma consulta do cadastro da pessoa que acabei de atualizar, a imagem que se encontra associada é a antiga e não a atualizada. O que é estranho, pois se formos olhar na pasta do projeto a imagem antiga nem existe mais, pois foi substituída pela atualizada.

Não tenho como postar aqui todo o código pois ele é muito extenso, mas deixo um exemplo de como estou escolhendo a imagem no JFileChooser e gravando ela na pasta:

public void escolherImagem() {
        JFileChooser fileChooser = new JFileChooser();  
        int option = fileChooser.showSaveDialog(null);
        String caminhoProject = System.getProperty("user.dir");
        File caminhoImagem = new File(caminhoProject+"/images/ImagemUser(x).jpg");
        
        try { 
            if(option == JFileChooser.APPROVE_OPTION) {
                
                //Pega o caminho da imagem selecionada no JfileChooser;
                File caminhoFile = fileChooser.getSelectedFile();
                
                //Cria um ImageIcon com o caminho da imagem selecionada e seta ele no ícone de um jlabel de uma tela qualquer;
                ImageIcon imageIcon = new ImageIcon(caminhoFile.getAbsolutePath());
                this.tCadastroPessoa.getjLabelImagemPessoa().setIcon(imageIcon);

                //Carrega um bufferedImage com o ícone do JLabel;
                bufferedImage = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
                bufferedImage.getGraphics().drawImage(((ImageIcon) this.tCadastroPessoa.getjLabelImagemPessoa().getIcon()).getImage(), 0, 0, null);
                
                //Grava a imagem do buffbufferedImage, com a extensão "jpg", no caminho especificado;
                ImageIO.write(bufferedImage, "jpg", caminhoImagem);
            } 
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Erro no carregamento da imagem.");
        }
    }

Quando eu fecho a aplicação e a compilo novamente, ao realizar a mesma consulta do cadastro atualizado a imagem, desta vez, vem corretamente atualizada. Isto me faz pensar que seja algum problema relacionado à limpeza do buffer, mas não tenho certeza e nem sei como limpa-lo.

Se alguém souber como ajudar, agradeço :slight_smile:

Que bruxaria é essa?
Tá parecendo erro de lógica.

Se a nova imagem aparece correta quando é selecionada, e a antiga não está mais presente no disco, mas aparece a imagem antiga quando você faz uma consulta ao registro logo após atualizar a imagem (sem fechar a aplicação), então o problema parece ser na parte de consulta, que não está sendo atualizada com a imagem nova. Eu suponho que a parte de consulta tem um bufferedimage/imageicon ou similar que você não está atualizando após a nova imagem ser selecionada. Por exemplo, nesse seu método, não notei nada que esteja atualizando uma classe de cliente ou objetos fora do método, além do jlabel da tela tCadastroPessoa.

Esse código de seleção parece estar fazendo mais coisas do que precisa, seria bom separar melhor essa lógica aí. Mas depende muito do restante do código, e de quanto trabalho você quer ter. E esse bufferedImage não está declarado dentro do método, o que me sugere que ele pode causar confusão em outro ponto do código. Deixe-o local, declarando dentro do método.

Abraço.

Então pessoal, obtive uma solução nesse post! https://www.guj.com.br/t/re-problema-no-registro-de-imagens-com-bufferedimage/430655?u=rodrigoalberto

Aparentemente era algo relacionado ao que eu pensava: a limpeza da memória. Usando o método ImageIcon.getImage().flush(), antes de setar a nova ImageIcon no JLabel, no meu contexto, funcionou corretamente.

@TerraSkilll A consulta que eu faço é num banco de dados SQL e já estava funcionando corretamente. Na verdade, eu guardo a String da localização da imagem no banco e carrego essa imagem na aplicação.

Como disse, o código é muito grande para postar e, por isso, condensei a dúvida nesse método que postei anteriormente.

Agradeço à todos!