Imagem em JPanel não fica permanente

Olá pessoal, estou com um problema, estou colocando uma imagem em um jpanel
consigo colocar a imagem nele blz, o que acontece é que depois de colocada a imagem
ela fica, mas derrepente depois de um tempo, se minimizar a tela e voltar (Algumas vezes)
o jpanel volta ao original e a imagem simplesmente some, já verifiquei e nada mais mexe na imagem
e nem no jpanel, o que será que pode estar acontecendo?
Tem algum jeito de deixar a imagem permanente?
estou usando o seguinte para desenhar a imagem no jpanel:

pnlimagem.getGraphics().drawImage(oImagem, 0, 0, null); //Desenha a imagem redimensionada no panel

Onde pnlimagem é o jpanel e oImagem é o objeto que passo para ser desenhado no jpanel

Vlw pela atenção pessoal…

Oi.
Pesquise sobre o método repaint() de JPanel. Acho que ele pode ser aplicado no seu caso.

Opa
Testei o repaint() mas ficou pior, quando faço o repaint() ele refaz o desenho mas refaz como o original do panel, ele não repinta a imagem que estava.

Dae vi também outro método o: pnlimagem.setIgnoreRepaint(); usei ele, mas também não fez efeito, a imagem sempre desaparece quando a janela é manipulada…
Alguma outra dica?

Oi.

É assim mesmo.

O swing não tem nenhuma responsabilidade de salvar a imagem que você desenhou no JPanel. Quando você minimiza e maximiza um painel, ou quando vc chama repaint, ou quando algo sobrepõe ao seu JPanel, o Swing chama o método paintComponent do JPanel novamente. E é você que tem a reponsabilidade de refazer tudo o que tinha pintado lá dentro.

Como resolver o problema, então? Bem, há duas formas:

  1. Se você tem a informação do que deve ser pintado em objetos, repinte-os;
  2. Ao invés de pintar diretamente no JPanel, pinte num BufferedImage. Depois, no método paint, simplesmente pinte essa BufferedImage no JPanel novamente.

O segundo item é o mais fácil de implementar.

Se você quer que o Painel tenha uma imagem, dá uma olhada nessa classe aqui:
http://www.guj.com.br/posts/list/56248.java#295271

Ah sim, a forma que vc usou o getDrawGraphics() está completamente equivocada. Você só deve pintar diretamente os componentes Swing se estiver fazendo um componente novo, ou complementando uma funcionalidade num componente já existente (como é o caso do JImagePanel, do link ali em cima).

Oi.
Eu aconselho você a fazer a segunda opção que o ViniGodoy falou.
Você usa um BufferedImage para lidar com a imagem. Quando for chamar o paintComponent você usa o método getGraphics() no parâmetro da chamada. É o jeito mais fácil e coeso, porque lida com uma coisa separada da outra. Além disso, mudar uma imagem ou selecionar outra não vai te trazer problemas.

Abraço.

Gente tô ficando doido com essa dificuldade, já estou com um BufferedImage e não consigo desenhar ele no painel, qual método devo usar?
Estou usando assim:
pnlimagem.paint(oImagemTela.getGraphics());

onde pnlimagem é meu panel e o oImagemTela é o BufferedImage ele aceita o código mais não pinta nada no panel, o que pode estar acontecendo?

Tenho outro objeto que é do tipo Image teria como pintar ele no panel?

Vlw pessoal.

Desculpe o post duplicado mas ninguém tem uma dica ae?
Vlw pessoal

Cara eu n manjo muito, mas tenho uma nocao e estou fazendo a mesma coisa que vc, e pra isso eu modifiquei uma classe onde uso ImageIcon. Ve se nao resolve o seu problema:

import java.awt.Dimension;
import java.awt.Graphics;
import java.io.File;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class PainelGrafico extends JPanel{
    private ImageIcon imageIcon;
    
    public PainelGrafico(){
        imageIcon = new ImageIcon("c:\imagens\basica.JPG");
    }
    public PainelGrafico(String caminho){
        imageIcon = new ImageIcon(caminho);
    }

    public ImageIcon getImageIcon() {
        return imageIcon;
    }

    public void setImageIcon(File arquivo) {
        
        ImageIcon temp = new ImageIcon(arquivo.getPath());
        this.imageIcon = temp;
    }
    public void paintComponent (Graphics g)
    {
        super.paintComponent(g);
        imageIcon.paintIcon(this,g, 0, 0);
    }
    public Dimension getPreferredSize(){
        return new Dimension( imageIcon.getIconWidth(),imageIcon.getIconHeight());
    }
}

E vc usa a classe assim:

PainelGrafico imagem = new PainelGrafico();//Para uma imagem pre definida dentro do construtor
//ou PainelGrafico imagemoriginal = new PainelGrafico("caminho da imagem");
JPanel exemplo = new JPanel();
exemplo.add(imagem);

Edentro do seu ActionPerformed vc usa:

Repaint();