Y.Okamoto@Psy.JWU

簡単な描画とダブルバッファリング

ダブルバッファリングの例はここをクリック

 

簡単な描画プログラム例を用意した。圧縮ファイルsimpleDraw.ZIPにプログラム(プロジェクト)を実行して、フレーム上のボタンjButton1をクリックする下図のような描画が行われる。

図1

simpleDraw.ZIPここをクリックしてダウンロードできる。ダウンロードして解凍すると作成されるフォルダsimpleDrawにあるプロジェクトファイルsimpleDraw.jpxをダブルクリックなどによりJBuilderで開くと実行することができる。実行時に表示されるフレーム上のjButton1をクリックすると次のリストのコードが実行されて描画が行われる。

    public void jButton1_actionPerformed(ActionEvent e) {

         Graphics g = contentPane.getGraphics();

         g.setColor(new Color(255,255,255));

         g.fillRect(0,35,500,500);           //  描画用領域を白で塗り潰す

 

         g.setColor(new Color(0,0,255));

         g.setFont(new Font("MS 明朝",Font.PLAIN,30));

         g.drawString("岡本安晴",20,80);

         g.setFont(new Font("Dialog",Font.BOLD,30));

         g.drawString("Y. Okamoto",20,120);

 

         g.setColor(new Color(200,255,0));

         g.fillOval(20,200,200,200);

 

         g.setColor(new Color(0,255,255));

         g.fillRect(250,200,200,200);

    }

フレームのサイズは、下図に示すようにコードを直接書き換えて設定する。

上のプログラムsimpleDraw.jpxでは、図1のように描画されたフレームを他のウィンドウ(フレーム)で覆い隠した後、再びフレームを表示すると下図のように描画内容が消えてしまう。これを回避する方法としてダブルバッファリングがある。

 

 


ダブルバッファリング

 

ダブルバッファリングでは、描画内容をImageインスタンスに保存しておいて、フレームが再表示されるときに、このImageインスタンスに保存されている描画内容を、フレームの表示時に自動的に実行されるpaintメソッドによってフレームに再表示するものである。上のsimpleDraw.jpxをダブルバッファリングによるものに変更したものを圧縮ファイルsimpleDraw1.ZIPとして用意した。simpleDraw1.ZIPここをクリックしてダウンロードできる。

paintメッソドでフレームにコピーするImageインスタンスの内容をjButtonのクリックで実行される以下のコードで描く。

    public void jButton1_actionPerformed(ActionEvent e) {

         img = this.createImage(500,500);

 

         Graphics g = img.getGraphics();  //    img上に描画

 

         g.setColor(new Color(255,255,255));

         g.fillRect(0,35,500,500);

 

         g.setColor(new Color(0,0,255));

         g.setFont(new Font("MS 明朝",Font.PLAIN,30));

         g.drawString("岡本安晴",20,80);

         g.setFont(new Font("Dialog",Font.BOLD,30));

         g.drawString("Y. Okamoto",20,120);

 

         g.setColor(new Color(200,255,0));

         g.fillOval(20,200,200,200);

 

         g.setColor(new Color(0,255,255));

         g.fillRect(250,200,200,200);

 

         repaint();     //  paintメソッドの実行を要求する

    }

最後のrepaintメッソドの実行によってpaintメッソドが呼び出されて、imgに描画された内容がフレームに表示される。

 

Up