Rastro da Imagem

9 respostas
bruno.savoini

Procurei uma série de informações a respeito do método paint, e paintComponent, mas ainda ão resolvi o problema.

tenho a Main, que tem um jframe com jpanels,esses jpanels, sao classes que dão um extens JPanel, e sobrescrevem o método paint(Graphics g)

o problema é que quando uma imagem, ou mesmo um desenho são feitos seguidamente, um rastro é mantido, e este rastro sai apenas no momento que minimizo a tela…

o método é g.drawImage(imagem, x,y,this)

ele é chamado para que uma imagem possa seguir o mouse, então na main tem um mouseListener no jframe, qdo o mouse se move, ele chama a instancia do painel, altera x, altera y, e da repaint… entao a figura de fato segue o mouse, entretanto gera o rastro da figura por onde o mouse passa…

é possível resolver colocando uma imagem de fundo, mas isso é uma “gambiarra” que atrapalha outras coisas do projeto… tem outra solução?

9 Respostas

bruno.savoini

Main

import javax.swing.JFrame;
import javax.swing.JPanel;

 
public class Main {

    
    public static void main(String[] args) {
        JFrame jf = new JFrame();
      
       final Painel p  = new Painel();
        p.setSize(500,500);
        p.setLocation(0,0);
        
          
        
        jf.add(p);
        
        
        jf.setSize(500,500);
        jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);
        jf.setVisible(true);
        
        
        
       jf.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {

            public void mouseMoved(java.awt.event.MouseEvent evt) {
                 p.x = evt.getX();
                 p.y = evt.getY();
                 p.repaint();
            }
        });
    }

}

Painel

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

 
public class Painel extends JPanel{
    int x;
    int y;
    
    Image a = new ImageIcon("C://1.gif").getImage();
public void paint(Graphics g){
    g.fillRect(x,y,20,20);
    g.drawImage(a, x, y, this);
}
}
ViniGodoy
  1. Se for um JPanel, sobrescreva o método paintComponent ao invés do paint;
  2. Nunca use o objeto Graphics diretamente. Tire uma cópia dele através do método create() e depois libere a cópia com dispose();
  3. Para solucionar seu problema, limpe a área de pintura antes de iniciar a pintura. Basta dar um fillRect da cor do background em toda área do JPanel. Isso não é uma gambiarra, o java simplesmente não apaga a área para você.

Você comentou que pintar uma imagem no fundo “atrapalham outras coisas do projeto”. Que coisas seriam essas?

bruno.savoini

entao, esse fillRect da certo, mas gera um outro problema

tou fazendo assim

tenho na verdade 3 j panels um em ciam do outro… poara fins de processamento fiz issso:
o de baixo torna-se encarregado de mostrar a imagem de fundo, e a figura q segue o mouse, o do meio serve para armazenar um arraylist de coordenadas, que é adicionado toda vez q o usuário clika na tela… e o de cima servirá para fazer um tipo de animação, esses objetos irão interagir…

o problema eh q quando estou com o mouse andando pela tela, está td bem, [e tem o retangulo branco ou imagem de fundo], não há rastro nem nada… mas ae quando eu clico, se eu clicar e não mover o mouse, onde eu clico repinta normal, mas quando eu movo o mouse, aparentemente esse jpanel que deveria ficar la em baixo, ele fica no meio, e tampa o que ficaria no meio… não sei e deu pra entender…
daqui a pouco vou dar uma enxugada no códig e posto aqui…

bruno.savoini

resolvi, mas não sei até quando!
procureipor transparencia em java e encontrei duas linhas de codigoq magicamente fizeram meucodigo funcionar

setOpaque(false);
        setBackground(new Color(0, 0, 0, 0));

ok, isso deu certo, mas implicou no processamento… não sei o motivo, mas isso faz com q pinte tds paineis…

ViniGodoy

Sim. Antes vc estava dizendo para o Java que seus painéis não são transparentes. Isso significava para ele que bastaria pintar o painel que foi alterado e que está por cima, pq os outros estariam escondidos.

Com o setOpaque(false) você está dizendo que a informações dos painéis de baixo é importante, já que os seus paineis não são transparentes. Por isso, ele é obrigado a repintar os 3 paineis.

Me diz uma coisa, sua pintura é em tela cheia? Digo, seu painel ocupa toda a área do JFrame?

bruno.savoini

sim todo jFrame, mas o jframe nao ocupa a tela inteira, eh 800x600 ±

ViniGodoy

Então use o BufferStrategy ao invés de usar um JPanel.
http://gpwiki.org/index.php/Java:Tutorials:Double_Buffering

Ele é muito mais rápido e bem melhor de usar.

bruno.savoini

ok…vou dar uma procurada …
ah, o link ta quebrado

ViniGodoy

Corrigi lá (foi uma novela).

Criado 10 de setembro de 2008
Ultima resposta 10 de set. de 2008
Respostas 9
Participantes 2