Double Buffer を調べる

Swing で Single Buffer と Double Buffer を切り替えて効果を調べます。

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

プログラムの作成

  1. Swing で JPanel を継承すると自動的に Double Buffer が使われるようになっています。 (?_?;
    Double Buffer は画面のチラツキを抑えるための手法ですが、Single Buffer と Double Buffer を切り替えて その効果を確かめてみました。
  2. メモ帳などでタイプして Test.java の名前で保存して下さい。
    //★ ダブルバッファリング のテスト
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    public class Test extends JFrame implements ItemListener
    {
        // Main()
        public static void main(String args[])
        {   new Test();
        }
    
        // Constructor
        Test()
        {   Container contentPane = getContentPane();
            contentPane.setLayout(new FlowLayout());
    
            JComponent jcom = new JComponentEx();
            jcom.setPreferredSize(new Dimension(200 , 50));
            contentPane.add(jcom);
            ((Checkbox)contentPane.add(new Checkbox("ダブルバッファリング" , true))).addItemListener(this);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(300, 150);
            setVisible(true);
        }
    
        // Listener
        public void itemStateChanged(ItemEvent e)
        {   Checkbox ch = (Checkbox)e.getItemSelectable();
            getRootPane().setDoubleBuffered(ch.getState());
            ((JComponent)getContentPane()).setDoubleBuffered(ch.getState());
        }
    
        // JComponentEx Class
        class JComponentEx extends JComponent implements Runnable
        {   int x = 0;
            public JComponentEx()
            {   (new Thread(this)).start();
            }
            public void run()
            {   while(true)
                {   Dimension dim = getSize();
                    if (++x == (dim.width - 10)) x = 0;
                    SwingUtilities.invokeLater(new Runnable()
                        {   public void run()
                            {   repaint();
                            }
                        });
                    try {   Thread.sleep(10);   }
                    catch(Exception err) {}
                }
            }
    
            // Paint
            public void paint(Graphics g)
            {   g.setColor(Color.blue);
                g.fillRect(10 , 10 , 10 + x , 20);
            }
        }
    }
    
  3. java のソースファイルをコンパイルして class オブジェクトを実行して下さい。
    Checkbox をクリックすると Single Buffer と Double Buffer が切り替わります。

プログラムの説明

  1. Swing(スィング)を使ったプログラムの基本的な説明は Swing を使って、色を設定して線を描く を参照して下さい。
  2. Constructor です。
    JComponentEx() と Checkbox() を生成して contentPane に貼り付けます。
        Test()
        {   Container contentPane = getContentPane();
            contentPane.setLayout(new FlowLayout());
    
            JComponent jcom = new JComponentEx();
            jcom.setPreferredSize(new Dimension(200 , 50));
            contentPane.add(jcom);
            ((Checkbox)contentPane.add(new Checkbox("ダブルバッファリング" , true))).addItemListener(this);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(300, 150);
            setVisible(true);
        }
        
  3. JComponentEx Class です。
    run() が起動されるメソッドです。
    x がバー(矩形)幅で、0 から dim.width - 10 を繰り返します。
    invokeLater() から Runnable Class の run() メソッドを呼び出します。
    run() メソッドでは repaint() で描画関数を呼び出します。
    try Thread.sleep(10) で10o秒置いて繰り返します。
        class JComponentEx extends JComponent implements Runnable
        {   int x = 0;
            public JComponentEx()
            {   (new Thread(this)).start();
            }
            public void run()
            {   while(true)
                {   Dimension dim = getSize();
                    if (++x == (dim.width - 10)) x = 0;
                    SwingUtilities.invokeLater(new Runnable()
                        {   public void run()
                            {   repaint();
                            }
                        });
                    try {   Thread.sleep(10);   }
                    catch(Exception err) {}
                }
            }
        
  4. Paint はバー(矩形)を描画するだけです。
            public void paint(Graphics g)
            {   g.setColor(Color.blue);
                g.fillRect(10 , 10 , 10 + x , 20);
            }
        
  5. Checkbox がクリックされたときに呼び出される itemStateChanged() です。
    getItemSelectable() で Checkbox の状態を取得します。
    ch.getState() は true または false の値に設定されます。
    この値を setDoubleBuffered() で設定します。
        public void itemStateChanged(ItemEvent e)
        {   Checkbox ch = (Checkbox)e.getItemSelectable();
            getRootPane().setDoubleBuffered(ch.getState());
            ((JComponent)getContentPane()).setDoubleBuffered(ch.getState());
        }
        
  6. このプログラムの作成にあたり、次のページを参照させていただきました。
    ダブルバッファリング

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