Double Buffer を使う

画面の「チラツキ」を抑えるために Double Buffer を使って描画します。

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

プログラムの作成

  1. メモ帳などでタイプして Double.java の名前で保存して下さい。
    //★ Double Buffer を使って Timer でバーの長さを変える    前田 稔
    import java.awt.*;
    import java.util.*;
    
    public class Double extends Frame
    {   Timer       time;
        int         num= 0;
        Dimension   size;
        Image       back;
        Graphics    buffer;
    
        // Main
        public static void main(String args[])
        {   new Double();
        }
    
        // Constructor
        public Double()
        {   super("DrawRect");
            time = new Timer();
            time.schedule(new TestTask(),300,100);
            setSize(300,100);
            setVisible(true);
            size = getSize();
            back= createImage(size.width, size.height);
        }
    
        // Paint Method
        public void paint(Graphics g)
        {   buffer= back.getGraphics();
            buffer.setColor(getBackground());
            buffer.fillRect(0, 0, size.width, size.height);
            buffer.setColor(Color.blue);
            buffer.fillRect(20,50,num,20);
            g.drawImage(back, 0, 0, this);
        }
    
        // Timer Task
        public class TestTask extends TimerTask
        {   public void run()
            {   num = (num+5) % 240;
                repaint();
            }
        }
    }
    
  2. java のソースファイルをコンパイルして class オブジェクトを実行して下さい。
    Timer 割り込みでバー(矩形)の幅が変わります。

プログラムの説明

  1. AWT を使ったプログラムの基本的な説明は 色を設定して線を描く を参照して下さい。
    AWT でタイマを使うので java.util.* をインポートします。
    time はタイマの Object です。
    num はバー(矩形)の幅です。
    size はウインドウのサイズを記憶する領域です。
    back が Back Buffer のイメージ領域で、buffer がその Graphics です。
    バーの描画は Back を使って画面イメージを完成してから、一挙に Front に転送します。
        import java.awt.*;
        import java.util.*;
        public class Double extends Frame
        {   Timer       time;
            int         num= 0;
            Dimension   size;
            Image       back;
            Graphics    buffer;
        
  2. Constructor です。
    super("DrawRect") で継承したクラスの Constructor を呼び出します。
    new Timer() でタイマをインスタンス化します。
    time.schedule(new TestTask(),300,100) でタイマで起動するタスクを登録します。
    new TestTask() が起動するタスクで、300o秒 が起動開始までの時間で、100 が起動する間隔です。
    setSize() で Window(Frame) のサイズを設定します。
    setVisible() で表示します。
    createImage(size.width, size.height) で Back Buffer を生成します。
    getSize(), createImage() は setVisible() の後に置いて下さい。
    失敗すると back に null が格納されます。
    buffer= back.getGraphics() で back の Graphics を取得します。
        // Constructor
        public Double()
        {   super("DrawRect");
            time = new Timer();
            time.schedule(new TestTask(),300,100);
            setSize(300,100);
            setVisible(true);
            size = getSize();
            back= createImage(size.width, size.height);
        }
        
  3. タイマ割り込みで起動するタスクのクラスです。
    TimerTask を継承します。
    void run() がタスクで起動されるメソッドです。
    num にバーの幅を設定して repaint() で描画するメソッドを呼びます。
        // Timer Task
        public class TestTask extends TimerTask
        {   public void run()
            {   num = (num+5) % 240;
                repaint();
            }
        }
        
  4. paint() は描画処理で呼び出されるメソッドです。
    描画の手順は Back Buffer を使って画面イメージを完成してから、一挙に Front に転送します。
    buffer= back.getGraphics() で back の Graphics を取得します。
    buffer.setColor() で色を設定して buffer.fillRect() で画面を塗りつぶします。
    色を blue に設定して fillRect(20,50,num,20) でバーを描きます。
    画面が完成したら g.drawImage(back, 0, 0, this) で Front に転送します。
        public void paint(Graphics g)
        {   buffer= back.getGraphics();
            buffer.setColor(getBackground());
            buffer.fillRect(0, 0, size.width, size.height);
            buffer.setColor(Color.blue);
            buffer.fillRect(20,50,num,20);
            g.drawImage(back, 0, 0, this);
        }
        
  5. 今回のプログラムでは Double Buffer を使わなくても「チラツキ」は気にならず、 Double Buffer を設定しても、あまり変わりませんでした。 (^_^;)
    プログラムの描画処理が軽かったせいでしょうか?
    もっと重量級の描画処理を行うと効果を発揮するかも知れません。
    マシンの性能が良くなったとはいえ、思った以上に「ちらつかない」のですが。 (?_?;
    Swing の Double Buffer は Double Buffer を調べる を参照して下さい。

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