Imagens seguidas

5 respostas
C

Boa tarde.
Gostaria de saber como posso pegar 3 imagens e fazê-las aparecer uma seguida da outra utilizando o sleep, ou se haveria outra forma de fazer este efeito. A idéia é que estas 3 imagens fique em um looping até que eu clique em um botão, esta segunda parte creio que não terei grandes problemas, mas fazê-las aparecer uma após a outra é que está me dando trabalho, se alguém puder me ajudar agradeceria.

5 Respostas

T

De fato, isso é meio chatinho porque o Swing não atualiza as imagens se você ficar esperando em um Thread.sleep. Lembre-se que o Swing só tem uma thread para pintar e atualizar tudo, portanto você não pode fazer nada demorado no Swing.
Em vez disso, você teria de usar um timer de x milissegundos para ficar trocando as imagens, até que você desligue o timer com o clicar do seu botão.

C

Mas este timer, não tem nada a ver com o valor que eu atribuo ao Sleep, qual método eu devo pesquisar ou estudar para aprender a fazer isso

T

http://java.sun.com/javase/6/docs/api/javax/swing/Timer.html

Marky.Vasconcelos

Voce pdoe guardar as 3 imagens em um objeto que muda a imagem a cada x milesimos.

Nao é tão dificil.

Vou fazer uma classe para voce ver.

Marky.Vasconcelos

Da pra melhorar.

package mark.utils.swing.img;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

public class ImageLoopPanel extends JPanel implements Runnable {
	private long tick;
	private BufferedImage imgs[];
	private int currentIndex;
	private long lastTick;

	public ImageLoopPanel(long tick, BufferedImage... imgs) {
		this.tick = tick;
		this.imgs = imgs.clone();
		this.tick = tick;
		currentIndex = 0;
		setMinimumSize(new Dimension(imgs[0].getWidth(), imgs[0].getHeight()));
		new Thread(this).start();
	}

	@Override
	public void paintComponent(Graphics g) {
		Graphics2D g2d = (Graphics2D) g.create();
		BufferedImage current = imgs[currentIndex];
		g2d.drawImage(current, 0, 0, current.getWidth(), current.getHeight(),
				null);
		g2d.dispose();
	}

	public void run() {
		while (true) {
			updateTick();
			repaint();
			try {
				Thread.sleep(tick);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	private void updateTick() {
		long currentTick = System.currentTimeMillis();
		if (currentTick - lastTick > tick)
			currentIndex++;
		lastTick = currentTick;
		if (currentIndex == imgs.length)
			currentIndex = 0;
	}
}

E um teste.

public class Tests{
private static void testImageLoops() throws IOException {
		File dir = new File("C:/imgs/");
		File imgs[] = dir.listFiles();
		ImageLoopPanel ilp = new ImageLoopPanel(10, load(imgs[0]), load(imgs[1]),
				load(imgs[2]), load(imgs[3]), load(imgs[4]));

		JFrame frame = new JFrame();
		frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
		frame.add(ilp);
		ilp.setVisible(true);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	public static BufferedImage load(File f) throws IOException {
		return ImageIO.read(f);
	}
	public static void main(String[] argss) throws Exception {
		testImageLoops();
	}
}
Criado 13 de abril de 2009
Ultima resposta 13 de abr. de 2009
Respostas 5
Participantes 3