Устранение мерцаний с помощью двойной буферизации
import java.awt.*;
import java.applet.Applet;
public class Animation2 extends Applet implements Runnable {
int fFrame = -1;
int fDelay;
Thread fThread;
Image[] fEarth;
MediaTracker fTracker;
Image fOffScreenImage;
Graphics fOffScreenGraphics;
public void init() {
fEarth = new Image[30];
String theString;
int theFramesPerSecond = 10;
fTracker = new MediaTracker( this );
fOffScreenImage = createImage(getSize().width,
getSize().height);
fOffScreenGraphics = fOffScreenImage.getGraphics();
// Заполнение второго буфера экрана синим цветом
fOffScreenGraphics.setColor(Color.blue);
fOffScreenGraphics.fillRect(0, 0,
getSize().width, getSize().height);
// Загрузка файлов изображений
for (int i=1; i<=30; i++)
{
fEarth[i-1] = getImage (getCodeBase(),
"./Earth"+i+".gif");
fTracker.addImage(fEarth[i-1], 0);
}
// Определение периода между кадрами в миллисекундах
theString = getParameter("fps");
try {
if (theString != null) {
theFramesPerSecond = Integer.parseInt(theString );
}
} catch (NumberFormatException e) {}
fDelay = (theFramesPerSecond > 0) ?
(1000 / theFramesPerSecond) : 100;
}
public void start() {
// Запуск нового потока анимации
if (fThread == null) {
fThread = new Thread(this);
}
fThread.start();
}
public void stop() {
// Остановка потока анимации
fThread = null;
}
public void run() {
// Работа с низким приоритетом; анимация не должна мешать основной обработке
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
long theStartTime = System.currentTimeMillis();
// Начало процесса вывода анимации
try {
fTracker.waitForID(0);
} catch (InterruptedException e) {
System.err.println("Interrupted Exception: " +
e.getMessage());
e.printStackTrace();
return;
}
while (Thread.currentThread() == fThread) {
// Переход к следующему кадру
fFrame++;
// Отображение нового кадра
repaint();
// Задержка, определяемая частотой кадров.
try {
theStartTime += fDelay;
Thread.sleep(Math.max(0,
theStartTime-System.currentTimeMillis()));
} catch (InterruptedException e) {
break;
}
}
}
public void update( Graphics g) {
// Заполнение дополнительного буфера синим цветом
fOffScreenGraphics.setColor(Color.blue);
fOffScreenGraphics.clearRect(0, 0,
getSize().width, getSize().height);
fOffScreenGraphics.fillRect(0, 0,
getSize().width, getSize().height);
paint(g);
}
// Отображение текущего кадра
public void paint(Graphics g) {
if (fTracker.checkID( 0 )) {
fOffScreenGraphics.drawImage(fEarth[fFrame % 30], 0, 0, this);
g.drawImage(fOffScreenImage, 0, 0, this);
}
}
}
Java файл