Imagem em JPanel não fica permanente

7 respostas
D

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…

7 Respostas

Andre_Brito

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

D

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?

ViniGodoy

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).

Andre_Brito

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.

D

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.

D

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

H

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();
Criado 26 de outubro de 2008
Ultima resposta 7 de nov. de 2008
Respostas 7
Participantes 4