/*
* Swing version.
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/*
* This applet displays several images in a row. It preloads
* the images using MediaTracker, which uses multiple background
* threads to download the images. The program displays a
* "Please wait" message until all the images are fully loaded.
* Note that the Swing ImageIcon class uses MediaTracker to
* preload images, so you can often use it instead of using
* Images and MediaTracker directly.
*/
public class MTImageSequenceTimer extends JApplet
implements ActionListener {
MTPanel mtPanel;
static int frameNumber = -1;
int delay;
static boolean frozen = false;
Timer timer;
boolean error;
MediaTracker tracker;
//Invoked only when run as an applet.
public void init() {
//Load the images.
Image images[] = new Image[10];
for (int i = 1; i <= 10; i++) {
images[i-1] = getImage(getCodeBase(), "images/T"+i+".gif");
}
buildUI(getContentPane(), images);
startAnimation();
}
void buildUI(Container container, Image[] dukes) {
tracker = new MediaTracker(this);
for (int i = 1; i <= 10; i++) {
tracker.addImage(dukes[i-1], 0);
error = tracker.isErrorAny();
}
int fps = 10;
//How many milliseconds between frames?
delay = (fps > 0) ? (1000 / fps) : 100;
//Set up a timer that calls this object's action handler.
timer = new Timer(delay, this);
timer.setInitialDelay(0);
timer.setCoalesce(true);
mtPanel = new MTPanel(dukes);
container.add(mtPanel, BorderLayout.CENTER);
mtPanel.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
if (frozen) {
frozen = false;
startAnimation();
} else {
frozen = true;
stopAnimation();
}
}
});
}
public void start() {
startAnimation();
}
public void stop() {
stopAnimation();
}
public synchronized void startAnimation() {
if (frozen) {
//Do nothing. The user has requested that we
//stop changing the image.
} else {
//Start animating!
if (!timer.isRunning()) {
timer.start();
}
}
}
public synchronized void stopAnimation() {
//Stop the animating thread.
if (timer.isRunning()) {
timer.stop();
}
}
public void actionPerformed(ActionEvent e) {
//Start downloading the images. Wait until they're
//loaded before requesting repaints.
try {
tracker.waitForAll();
} catch (InterruptedException exc) {}
//Advance the frame.
frameNumber++;
//Display it.
mtPanel.repaint();
}
class MTPanel extends JPanel {
Image dukesWave[];
public MTPanel(Image[] dukesWave) {
this.dukesWave = dukesWave;
}
//Draw the current frame of animation.
public void paintComponent(Graphics g) {
super.paintComponent(g); //paint the background
int width = getWidth();
int height = getHeight();
//If not all the images are loaded,
//just display a status string.
if (!tracker.checkAll()) {
g.drawString("Please wait...", 0, height/2);
return;
}
//Paint the frame into the image.
g.drawImage(dukesWave[MTImageSequenceTimer.frameNumber%10],
0, 0, this);
}
}
//Invoked only when run as an application.
public static void main(String[] args) {
Image[] waving = new Image[10];
for (int i = 1; i <= 10; i++) {
waving[i-1] =
Toolkit.getDefaultToolkit().getImage("images/T"+i+".gif");
}
JFrame f = new JFrame("MTImageSequenceTimer");
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
MTImageSequenceTimer controller = new MTImageSequenceTimer();
controller.buildUI(f.getContentPane(), waving);
controller.startAnimation();
f.setSize(new Dimension(75, 100));
f.setVisible(true);
}
}
|