Rastro das Imagens

10 respostas
muhlucas

Bem estou tendo um problema com meu projeto eu já pesquisei mais nada que eu encontrei me ajudou, se alguém puder me ajudar agradeço…
O problema é que ao passar o mouse sobre determinada cor ou imagem a cor ou imagem fica ao fundo de algum item que o mouse passar, meio que um rastro do mouse.

Tirei um print para vocês poderem entender melhor

Não postei o código pois não sei em qual parte esta o problema…

Agradeço deis de já

10 Respostas

B

Pergunta básica número um - você mostrou o que acontece, mas o que você esperaria se não houvesse o problema?
Só de olhar a figura não entendi bulhufas o seu problema.
Por favor, mostre uma imagem com o que você esperaria se o programa estivesse certo.
É que muitas vezes eu vejo uma coisa mas não sei o que é certo ou errado, e as pessoas só põem o que está errado, sem conseguirmos poder comparar com o que elas acham que está certo.

Marky.Vasconcelos

Voce deu um super.paintComponent no seu JComponent que desenha isso na tela?

ViniGodoy

Aliás, você chegou a colocar o código de pintura dentro do paintComponent?

muhlucas

O que está errado é que as imagens ficam ao fundo das outras…
A unica coisa que eu uso o paintComponent é no plano de fundo que alias eu sobrescrevi ele,
ja com imagens eu adiciono direto

ImageIcon nomeImage = new ImageIcon(getClass().getClassLoader().getResource(“endereço”));

e depois adiciono ao JButton
btnImg.setIcon(nomeImage);

o JButton esta com esses 3 métodos

btnImg.setContentAreaFilled(false);

btnImg.setBorderPainted(false);

btnImg.setFocusPainted(false);

sim eu usei o super.paintComponent(g);

o código que sobrescreve o paintComponent do JPanel

// Classe responsavel por pintar Paineis 
class FundoBg extends JPanel
{
 private String urlImg = "";
   
 private int x = 0;
 private int y = 0;
 
 public FundoBg(String urlImg)
 {
  this.urlImg = urlImg;
 }
 public FundoBg()
 {
 }
    @Override
 public void paintComponent(Graphics g)
 {
  super.paintComponent(g);      
  Graphics gr = (Graphics2D)g.create();
  try
  {     
   BufferedImage buffer = ImageIO.read(new File(urlImg));
   gr.drawImage(buffer, x, y,this.getWidth(),this.getHeight(),this);
   gr.dispose();
   
  }
  catch(IOException ex)
  {
   Logger.getLogger(FundoBg.class.getName()).log(Level.SEVERE,null,ex);
  }
 }
}
ViniGodoy

Não deixe o "read" dentro do seu paintComponent.
Esse método deve retornar rapidamente. Jamais faça operações caras (como leituras de arquivo) dentro dele.

// Classe responsavel por pintar Paineis 
class FundoBg extends JPanel {
    private BufferedImage img = null;  
    private int x = 0;
    private int y = 0;
 
    public FundoBg(String urlImg) throws IOException    {
        this.img =  ImageIO.read(new File(urlImg));
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);      
        Graphics gr = (Graphics2D)g.create();
        gr.drawImage(img, x, y,this.getWidth(),this.getHeight(),this);
        gr.dispose();   
    }
}
muhlucas

Coloquei o read do jeito que você falou porem ainda continua aquele problema com as imagens…
Alguma ideia do que possa ser ?

matheuslmota
ViniGodoy:
Não deixe o "read" dentro do seu paintComponent. Esse método deve retornar rapidamente. Jamais faça operações caras (como leituras de arquivo) dentro dele.
// Classe responsavel por pintar Paineis 
class FundoBg extends JPanel {
    private BufferedImage img = null;  
    private int x = 0;
    private int y = 0;
 
    public FundoBg(String urlImg) throws IOException    {
        this.img =  ImageIO.read(new File(urlImg));
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);      
        Graphics gr = (Graphics2D)g.create();
        gr.drawImage(img, x, y,this.getWidth(),this.getHeight(),this);
        gr.dispose();   
    }
}
Viny, tenho uma dúvida. Por que é necessário fazer a cópia do objeto Graphics após chamar o super.paintComponent? Pergunto isso porque a implementação do método paintComponent herdada da classe JComponent é essa (segundo o fonte do openjdk 7):
protected void paintComponent(Graphics g) {
        if (ui != null) {
            Graphics scratchGraphics = (g == null) ? null : g.create();
            try {
                ui.update(scratchGraphics, this);
            }
            finally {
                scratchGraphics.dispose();
            }
        }
    }
Aqui ele já faz uma cópia do objeto Graphics, por que então efetuar a cópia do graphics na sobrecarga do paintComponent? Ao meu ver ela não é necessária.
E

É necessária sim, porque seu código primeiro chama super.paintComponent (ou seja, ele faz uma cópia, desenha as coisas e destrói - dispose() - essa cópia), não é que é chamado por paintComponent da classe pai. O “finally”, como você deve se lembrar, força que o dispose seja chamado de qualquer maneira, mesmo que tenha havido alguma exceção irreparável no código do desenho.

Se quiser fazer qualquer coisa depois do super.paintComponent, você precisa fazer outra cópia do contexto (que na verdade é uma operação super-rápida, já que é é uma cópia de um objeto que contém basicamente meia dúzia de referências para outros objetos) e depois de você desenhar as coisas, destruir essa sua cópia. Aproveite e use a idéia do “finally” para que esse objeto Graphics seja destruído sempre, mesmo que houver alguma exceção no seu paintComponent.

matheuslmota

entanglement:
É necessária sim, porque seu código primeiro chama super.paintComponent (ou seja, ele faz uma cópia, desenha as coisas e destrói - dispose() - essa cópia), não é que é chamado por paintComponent da classe pai. O “finally”, como você deve se lembrar, força que o dispose seja chamado de qualquer maneira, mesmo que tenha havido alguma exceção irreparável no código do desenho.

Se quiser fazer qualquer coisa depois do super.paintComponent, você precisa fazer outra cópia do contexto (que na verdade é uma operação super-rápida, já que é é uma cópia de um objeto que contém basicamente meia dúzia de referências para outros objetos) e depois de você desenhar as coisas, destruir essa sua cópia. Aproveite e use a idéia do “finally” para que esse objeto Graphics seja destruído sempre, mesmo que houver alguma exceção no seu paintComponent.

Entendi, no caso a chamada ao super.paintComponent é pra fazer o desenho default do próprio component e algum desenho que eu precise fazer eu tenho que copiar o contexto novamente. Obrigado pela explicação.

muhlucas

Ainda não consegui resolver o problema do rastro das imagens…
será que tem algum método ou classe ou algum @override que eu possa usar para tentar substituir esse:

ImageIcon nome = new ImageIcon(getClass().getClassLoader().getResource());

para ver se o problema é com essa forma de carregar a imagem no JButton.

Criado 9 de agosto de 2012
Ultima resposta 14 de ago. de 2012
Respostas 10
Participantes 6