import java.awt.*; import javax.swing.*; /* */ 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) {} } } public static void main(String[] args) { JFrame frame = new JFrame("ぐるぐる!"); JApplet applet = new GuruguruDoubleBuffered(); applet.setPreferredSize(new Dimension(200, 150)); frame.add(applet); frame.pack(); frame.setVisible(true); applet.init(); applet.start(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }