画像の回転で Double Buffer を使う

画像の回転で Double Buffer を使って、その効果を確認します。

前田稔の超初心者のプログラム入門

プログラムの作成

  1. Double Buffer の効果を確認する絶好のアプリケーションが見つかりました。
    まずは Double Buffer を使わないプログラムです。
    メモ帳などでタイプして AWTRotate.java の名前で保存して下さい。
    //★ Window を回転する(チラツキます)    前田 稔
    import java.awt.*;
    import java.util.*;
    import static java.lang.Math.PI;
    
    class AWTRotate extends Frame
    {   Image   img;
        Timer   time;
        int     Rate = 0;
    
        // Main
        public static void main(String args[])
        {   new AWTRotate();
        }
    
        // Constructor
        public AWTRotate()
        {   super("AWT Rotate");
            img = getToolkit().getImage("c:\\data\\test\\ayu.gif");
            time = new Timer();
            time.schedule(new TestTask(),300,30);
            setSize(320, 320);
            setVisible(true);
        }
    
        // Paint
        public void paint(Graphics g)
        {   Graphics2D g2d = (Graphics2D)g;
            Dimension  size = getSize();
            g2d.setColor(getBackground());
            g2d.fillRect(0, 0, size.width, size.height);
            g2d.rotate(Rate*PI/180,size.width/2.0,size.height/2.0);
            g2d.drawImage(img,0,0,this);
        }
    
        // Timer Event
        public class TestTask extends TimerTask
        {   public void run()
            {   Rate = ++Rate % 360;
                repaint();
            }
        }
    }
    
  2. "c:\\data\\test\\ayu.gif" の画像を回転しながら描画します。
    テストするときは適当なサイズの画像を調達して来て、フルパスで指定して下さい。

  1. Double Buffer を使ったプログラムです。
    メモ帳などでタイプして AWTRotate2.java の名前で保存して下さい。
    //★ Window を回転する(Double Buffer)    前田 稔
    import java.awt.*;
    import java.util.*;
    import static java.lang.Math.PI;
    
    class AWTRotate2 extends Frame
    {   Image       img;
        Timer       time;
        int         Rate = 0;
        Dimension   size;
        Image       back;
        Graphics2D  buffer;
    
        // Main
        public static void main(String args[])
        {   new AWTRotate2();
        }
    
        // Constructor
        public AWTRotate2()
        {   super("AWT Rotate");
            img = getToolkit().getImage("c:\\data\\test\\ayu.gif");
            time = new Timer();
            time.schedule(new TestTask(),300,30);
            setSize(320, 320);
            setVisible(true);
            size = getSize();
            back= createImage(size.width, size.height);
            if (back==null) System.out.print("createImage Error");
        }
    
        // Paint
        public void paint(Graphics g)
        {   buffer= (Graphics2D)back.getGraphics();
            size = getSize();
            buffer.setColor(getBackground());
            buffer.fillRect(0, 0, size.width, size.height);
            buffer.rotate(Rate*PI/180,size.width/2.0,size.height/2.0);
            buffer.drawImage(img,0,0,this);
            g.drawImage(back,0,0,this);
        }
    
        // Timer Event
        public class TestTask extends TimerTask
        {   public void run()
            {   Rate = ++Rate % 360;
                repaint();
            }
        }
    }
    

プログラムの説明

  1. AWT を使ったプログラムの基本的な説明は 色を設定して線を描く を参照して下さい。
    AWT でタイマを使うので java.util.* をインポートします。
    time はタイマの Object です。
    Rate は回転角度です。
    size はウインドウのサイズを記憶する領域です。
    back が Back Buffer のイメージ領域で、buffer がその Graphics です。
    画像の描画は Back を使って画面イメージを完成してから、一挙に Front に転送します。
        import java.awt.*;
        import java.util.*;
        import static java.lang.Math.PI;
    
        class AWTRotate2 extends Frame
        {   Image       img;
            Timer       time;
            int         Rate = 0;
            Dimension   size;
            Image       back;
            Graphics2D  buffer;
        
  2. Constructor です。
    super("AWT Rotate") で継承したクラスの Constructor を呼び出します。
    new Timer() でタイマをインスタンス化します。
    time.schedule(new TestTask(),300,30) でタイマで起動するタスクを登録します。
    new TestTask() が起動するタスクで、300o秒 が起動開始までの時間で、30 が起動する間隔です。
    setSize() で Window(Frame) のサイズを設定します。
    setVisible() で表示します。
    createImage(size.width, size.height) で Back Buffer を生成します。
    getSize(), createImage() は setVisible() の後に置いて下さい。
    失敗すると back に null が格納されます。
        // Constructor
        public AWTRotate2()
        {   super("AWT Rotate");
            img = getToolkit().getImage("c:\\data\\test\\ayu.gif");
            time = new Timer();
            time.schedule(new TestTask(),300,30);
            setSize(320, 320);
            setVisible(true);
            size = getSize();
            back= createImage(size.width, size.height);
            if (back==null) System.out.print("createImage Error");
        }
        
  3. タイマ割り込みで起動するタスクのクラスです。
    TimerTask を継承します。
    void run() がタスクで起動されるメソッドです。
    Rate に回転角度を設定して repaint() で描画するメソッドを呼び出します。
        // Timer Event
        public class TestTask extends TimerTask
        {   public void run()
            {   Rate = ++Rate % 360;
                repaint();
            }
        }
        
  4. paint() は描画処理で呼び出されるメソッドです。
    描画の手順は Back Buffer を使って画面イメージを完成してから、一挙に Front に転送します。
    buffer= back.getGraphics() で back の Graphics を取得します。
    buffer.setColor() で色を設定して buffer.fillRect() で画面を塗りつぶします。
    buffer.rotate() がウインドウ(画像)を回転するメソッドです。
    buffer.drawImage() で回転したキャンバスの上から今までと同様に描画します。
    画面が完成したら g.drawImage(back, 0, 0, this) で Front に転送します。
        // Paint
        public void paint(Graphics g)
        {   //Graphics2D g2d = (Graphics2D)g;
            buffer= (Graphics2D)back.getGraphics();
            size = getSize();
            buffer.setColor(getBackground());
            buffer.fillRect(0, 0, size.width, size.height);
            buffer.rotate(Rate*PI/180,size.width/2.0,size.height/2.0);
            buffer.drawImage(img,0,0,this);
            g.drawImage(back,0,0,this);
        }
        
  5. 二本のプログラムを実行していただければ、その違いは明白です。
    さすが Double Buffer の面目躍如といった所でしょうか。 (^_^;)

超初心者のプログラム入門(Java2)