Como fazer uma animacao de um JPanel?

4 respostas
J

Tava precisando da ajuda de voces denovo...

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

eu evolui ele um pouco e cheguei nisso:
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);
	}
}
OBS: Figura do codigo: [IMG]http://img13.imageshack.us/img13/764/disk.jpg[/IMG]

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.

4 Respostas

tivrfoa

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(){})

?

J

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

M

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.

J

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.

Criado 4 de março de 2009
Ultima resposta 6 de mar. de 2009
Respostas 4
Participantes 3