import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JApplet;

/* <applet code="GuruguruDoubleBuffered.class" width="200" height="150"> </applet> */

public class GuruguruDoubleBuffered extends JApplet implements Runnable {
	int r = 50, x = 110, y = 70;
	double theta = 0; // 角度
	Thread thread = null;
	Dimension size;
	Image offScreen;
	Graphics gOff;

	@Override
	public void init() {
		size = getSize();
		offScreen = createImage(size.width, size.height);  // オフスクリーンイメージ
		gOff = offScreen.getGraphics(); // offScreen に描画するための Graphics
	}
	
// 以下のような paint のオーバーライドが必要と書かれている参考資料も多いが、
// 少なくとも現バージョンの Java ライブラリでは必要ない
//	@Override
//	public void update(Graphics g) {
//		paint(g);
//	}

	@Override
	public void paint(Graphics g) {
//		super.paint(g);                                // これをするとちらつく
		gOff.clearRect(0, 0, size.width, size.height); // オフスクリーンイメージを一旦消去
		gOff.drawString("Hello, World!", x, y);        // オフスクリーンに描画
		g.drawImage(offScreen, 0, 0, this);            // オフスクリーンイメージを画面にコピー
	}

	@Override
	public void start() {
		if (thread == null) { // 念のためチェック
			thread = new Thread(this);
			thread.start();
		}
	}

	@Override
	public void stop() {
		thread = null;
	}

	public void run() {
		Thread thisThread = Thread.currentThread();
		for (; thread == thisThread; theta+=0.02) {
			x = 60+(int)(r*Math.cos(theta)); y = 70-(int)(r*Math.sin(theta));
			repaint();  // paintを間接的に呼出す
			try {
				Thread.sleep(10); // 10 ミリ秒お休み
			} catch (InterruptedException e) {}
		}
	}
}
