import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class BufferedImageThread extends JFrame {
AnimationCanvas canvas;
JButton startButton, stopButton;
public BufferedImageThread() {
super();
Container container = getContentPane();
canvas = new AnimationCanvas();
container.add(canvas);
startButton = new JButton("Start Animation");
startButton.addActionListener(new ButtonListener());
stopButton = new JButton("Stop Animation");
stopButton.addActionListener(new ButtonListener());
JPanel panel = new JPanel();
panel.add(startButton);
panel.add(stopButton);
container.add(BorderLayout.SOUTH, panel);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setSize(450, 425);
setVisible(true);
}
class ButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
JButton temp = (JButton) e.getSource();
if (temp.equals(startButton)) {
canvas.start();
} else if (temp.equals(stopButton)) {
canvas.stop();
}
}
}
public static void main(String arg[]) {
new BufferedImageThread();
}
}
class AnimationCanvas extends JLabel implements Runnable {
Thread thread;
Image image;
BufferedImage bi;
double x, y, xi, yi;
int rotate;
double scale;
int UP = 0;
int DOWN = 1;
int scaleDirection;
AnimationCanvas() {
setBackground(Color.green);
setSize(450, 400);
image = getToolkit().getImage("largeJava2sLogo.gif");
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);
}
rotate = (int) (Math.random() * 360);
scale = Math.random() * 1.5;
scaleDirection = DOWN;
xi = 50.0;
yi = 50.0;
}
public void step(int w, int h) {
x += xi;
y += yi;
if (x > w) {
x = w - 1;
xi = Math.random() * -w / 32;
}
if (x < 0) {
x = 2;
xi = Math.random() * w / 32;
}
if (y > h) {
y = h - 2;
yi = Math.random() * -h / 32;
}
if (y < 0) {
y = 2;
yi = Math.random() * h / 32;
}
if ((rotate += 5) == 360) {
rotate = 0;
}
if (scaleDirection == UP) {
if ((scale += 0.5) > 1.5) {
scaleDirection = DOWN;
}
} else if (scaleDirection == DOWN) {
if ((scale -= .05) < 0.5) {
scaleDirection = UP;
}
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Dimension d = getSize();
bi = new BufferedImage(d.width, d.height, BufferedImage.TYPE_INT_ARGB);
Graphics2D big = bi.createGraphics();
step(d.width, d.height);
AffineTransform at = new AffineTransform();
at.setToIdentity();
at.translate(x, y);
at.rotate(Math.toRadians(rotate));
at.scale(scale, scale);
big.drawImage(image, at, this);
Graphics2D g2D = (Graphics2D) g;
g2D.drawImage(bi, 0, 0, null);
big.dispose();
}
public void start() {
thread = new Thread(this);
thread.setPriority(Thread.MIN_PRIORITY);
thread.start();
}
public void stop() {
if (thread != null)
thread.interrupt();
thread = null;
}
public void run() {
Thread me = Thread.currentThread();
while (thread == me) {
repaint();
}
thread = null;
}
}
|