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…
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 código que sobrescreve o paintComponent do JPanel
// Classe responsavel por pintar Paineis classFundoBgextendsJPanel{privateStringurlImg="";privateintx=0;privateinty=0;publicFundoBg(StringurlImg){this.urlImg=urlImg;}publicFundoBg(){}@OverridepublicvoidpaintComponent(Graphicsg){super.paintComponent(g);Graphicsgr=(Graphics2D)g.create();try{BufferedImagebuffer=ImageIO.read(newFile(urlImg));gr.drawImage(buffer,x,y,this.getWidth(),this.getHeight(),this);gr.dispose();}catch(IOExceptionex){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 classFundoBgextendsJPanel{privateBufferedImageimg=null;privateintx=0;privateinty=0;publicFundoBg(StringurlImg)throwsIOException{this.img=ImageIO.read(newFile(urlImg));}@OverridepublicvoidpaintComponent(Graphicsg){super.paintComponent(g);Graphicsgr=(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 classFundoBgextendsJPanel{privateBufferedImageimg=null;privateintx=0;privateinty=0;publicFundoBg(StringurlImg)throwsIOException{this.img=ImageIO.read(newFile(urlImg));}@OverridepublicvoidpaintComponent(Graphicsg){super.paintComponent(g);Graphicsgr=(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):
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
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.
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.