//
package widgets;
import java.awt.*;
public abstract class BufferedApplet extends java.applet.Applet implements Runnable
{
abstract public void render(Graphics graphics);
public boolean damage() { return damage; }
Object lock = new Object();
boolean isLocked = false;
private Thread t;
private int ticks = 0;
public void init() { if (t == null) (t = new Thread(this)).start(); }
public void start() { synchronized(lock) { lock.notifyAll(); isLocked = false; } }
public void stop() { isLocked = true; }
public void run() {
try {
while (true) {
if (isLocked) synchronized(lock) { lock.wait(); }
repaint();
t.sleep(30);
ticks++;
}
} catch(InterruptedException e){};
}
private Rectangle r = new Rectangle(0,0,0,0);
private Image bufferImage = null;
protected Graphics bufferGraphics = null;
public boolean damage = true;
public void update(Graphics g) {
if (r.width != bounds().width || r.height != bounds().height) {
bufferImage = createImage(bounds().width, bounds().height);
bufferGraphics = bufferImage.getGraphics();
r = bounds();
damage = true;
}
if (damage())
render(bufferGraphics);
if (damage() || ticks % 30 == 0)
if (bufferImage != null)
g.drawImage(bufferImage,0,0,this);
damage = false;
}
}