JPanel: método paint() não pinta corretamente [Resolvido]

colegas,

tenho uma app desktop conectada a um scaner. Quando um documento é escaneado, o usuário deve visualiza-la em um JPanel e depois salvar. Assim que o scanner termina a digitalização do documento e o converte para imagem, consigo exibir a imagem na área do JPanel imediatamente chamando o método repaint() do mesmo. Mas ao exibir a imagem, o panel tambem exibe algumas partes da janela, como se eu tivesse dado um print na tela, fica então uma imagem mesclada na area do panel.

Se redimensiono a janela, então a imagem arruma, e o panel exibe como teria que exibir inicialmente, sem pegar uma parte da tela, mostrando só o arquivo digitalizado mesmo.

Alguém sabe como posso resolver esse problema, ou seja, mostrar só a imagem do arquivo, sem “rabiscos” de outras partes da tela?

segue meu JPanel estendido:

import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JPanel;

public class DesenhaImagem extends JPanel{
    
     private Image img;

    @Override
    public void paint(Graphics g) {
        graphics = g;
        g.drawImage(img, 0, 0, null);        
    }   

    //chamdo pelo controlador do scanner
    public void setImg(Image img) {
        Image awtImage = img.getScaledInstance(310, 430, 0);
        this.img = awtImage;
        super.repaint();         //atualiza e desenha a imagem na area do panel (mas desenha com interferencia, a imagem só fica correta quando o usuario redimensiona a janela)
    }

    public Image getImg() {
        return img;
   }      
}

valeu

  1. Em um JPanel não se sobreescreve o método paint e sim paintComponent
  2. Não se deve usar diretamente o objeto Graphics que é passado como parâmetro do método paintComponent e sim fazer uma cópia dele.
  3. Não se esquecer de chamar super.paintComponent() no local adequado
    Normalmente você faz algo como:

@Override public void paintComponent (Graphics g) { super.paintComponent (g); Graphics2D = (Graphics2D)g.create(); // apesar do nome, isto é um clone ou uma cópia de g, não um objeto limpo e vazio g2d.drawImage (img, 0, 0, null); g2d.dispose(); // esqueci de chamar dispose :( }

valeu parceiro, deu certo!! É que não to acostumado com essas classe gráficas do java :slight_smile:

Mudei o método paintComponent porque havia esquecido de chamar dispose :frowning: