Como fazer uma animacao de um JPanel?

Tava precisando da ajuda de voces denovo…

Entao, baseado nesse codigo:
http://www.java2s.com/Code/Java/2D-Graphics-GUI/Imagewithmousedragandmoveevent.htm

eu evolui ele um pouco e cheguei nisso:

[code]import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class BufferedImageMouseDrag extends JFrame {

public BufferedImageMouseDrag() {

	add(new DisplayCanvas());

	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setSize(300, 700);
	setVisible(true);
}

public static void main(String arg[]) {
	new BufferedImageMouseDrag();
}

}

class DisplayCanvas extends JPanel {
int x = 140, y = 500;
BufferedImage bi;
boolean mousePressed = false;

DisplayCanvas() {
	setBorder(BorderFactory.createLineBorder(Color.red));
	setBackground(Color.black);

	Image image = getToolkit().getImage("disk.jpg");

	MediaTracker mt = new MediaTracker(this);
	mt.addImage(image, 1);
	try {
		mt.waitForAll();
	} catch (Exception e) {
		System.out.println("Exception while loading image.");
	}

	if (image.getWidth(this) == -1) {
		System.out.println("no gif file");
		System.exit(0);
	}

	bi = new BufferedImage(image.getWidth(this), image.getHeight(this),	BufferedImage.TYPE_INT_ARGB);
	Graphics2D big = bi.createGraphics();
	big.drawImage(image, 0, 0, this);

	addMouseListener(new MouseAdapter() {
		public void mousePressed(MouseEvent e) {
			if ((e.getX()>x && e.getX()<x+26) && (e.getY()>y && e.getY()<y+26)) {
				mousePressed = true;
				x = e.getX() - 15;
				y = e.getY() - 13;
				repaint();
			}
		}

		public void mouseReleased(MouseEvent e) {
			if (mousePressed == true) {
				double finalPos = 500 - Math.pow((e.getY() - 500), 1.1);
				int ArrastoY = e.getY();
				while (ArrastoY > finalPos) {
					y = ArrastoY;
					repaint();
					ArrastoY--;
				}
			}
			mousePressed = false;
		}
	});

	addMouseMotionListener(new MouseAdapter() {
		public void mouseDragged(MouseEvent e) {
			if (mousePressed == true) {
				x = e.getX() - 15;
				y = e.getY() - 13;
				repaint();
			}
		}
	});
}


public Dimension getPreferredSize() {
	return new Dimension(300, 620);
}

public void paintComponent(Graphics g) {
	super.paintComponent(g);

	Graphics2D g2D = (Graphics2D) g;
	if (mousePressed == true) {
		g2D.setColor(Color.yellow);
		g2D.drawLine(150, 500, x + 13, y + 10);
	}
	g2D.drawImage(bi, x, y, this);
}

}[/code]
OBS: Figura do codigo:
[URL=http://img13.imageshack.us/my.php?image=disk.jpg][/URL]

Enfim. Ta quase do jeito que eu preciso. O resto do codigo eu ja sei como fazer.

O problema que estou tendo eh porque o disco, quando arrastado pra baixo da posicao original, eh pra ser lancado pra cima, mas animado, ou seja, a cada (x,y) que ele sobe ele eh mostrado. O problema eh que isso nao ta acontecendo, aparece de vez no destino final.

Alguem tem alguma ideia? Usar thread.sleep(1000) como ja me indicaram nao funciona.

blz
no seu não tá dando esse erro não:

the method addMouseMotionListener(MouseMotionListener) in the type Component is not applicable for the arguments (new MouseAdapter(){})

?

o meu programa e o do link rodaram sem problema em duas ides

Acontece que dentro de um while, mesmo que haja o método repaint(), a Thread principal do swing não repintará o painel, causando aquele "teletransporte’ para outro lugar.

Uma dica: animações em Java, em mais de 95% dos casos, envolve Threads.

Hmmm nao sabia disso de repaint() nao funcionar dentro de while, agora pelo menos entendi porque nao funcionou.

Valeu pela dica. Estou refazendo o programa, e dessa vez com Threads.