JavaA2Z

KAB-studio > プログラミング > JavaA2Z > 再描画とは

再描画

日本語 再度描画
英語 repaint、redraw
ふりがな さいびょうが
フリガナ サイビョウガ

解説

画面に図形や文字を再度描くこと。
 
画面への描画は、基本的には「再描画」時にう。
それは、再描画が「非常に頻繁にわれること」であり、再描画時に描画わないと「以前の描画内容が消えてしまう」ためである。
 
コンピューターの画面は、基本的に「一枚のキャンバス」のようになっている。
ウィンドウが手前や奥に移動した場合、ウィンドウの描画内容はそのまま前後に移動するように見えるが、実際にはそうではなく、手前に来たウィンドウによって「上塗り」される。
それは、まるで一枚のキャンバスに描かれる油絵のように、奥へ移動したウィンドウの描画内容を塗り潰して、手前に来たウィンドウの描画内容を描くようにである。
そのため、ウィンドウは手前に来たり、最小化から復活したりした際に、画面上に描画う必要がある。
これが「再描画」である。
再描画時に描画わない場合、ウィンドウが奥に移動するなどして他のウィンドウが上書きすると、再度手前に来た時にはすでに描画した図は消えており、再描画時にも描画されないため、以前の描画内容が失われることになる。
そのため、再描画時に描画うことが必須となる。
 
AWTであればComponentクラスのpaint()メソッドを、アプレットであればAppletクラスがComponentのサブクラスのため同じくpaint()メソッドを、オーバーライドすることで、このpaint()メソッドが再描画時に呼び出されるため、その際に引数に渡されたGraphicsクラスを使用して描画う。
「マウスのクリック時」といったイベントに対応して描画う場合、「クリックした点」等を情報として保存しておき、その後Componentクラスのrepaint()メソッド呼び出す
このメソッドは再描画を命令するため、これによりpaint()メソッドが呼び出され、再描画がわれる。paint()メソッドでは「クリックした点」等の情報を元に描画うようにする。
このように、任意のイベント発生時には「描画内容を保存」→「再描画を指示」→「情報を元に再描画時に描画」という手順を踏むことで、通常の再描画時にも「情報を元に再描画時に描画」がわれ、適切な描画われることになる。
 
再描画の概念はやや分かりにくいが、描画処理の基本であるため理解しておくのがいいだろう。

(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// Sample.java
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

/**
*   Eclipseで試す場合には、「デバッグ」の
*   「Java Applet」として新規に作成してください。
*/
public class Sample extends Applet
{
    // 直線を引く際の開始位置と終了位置。
    // お行儀悪いですがpublicフィールドにします。
    public int fromX = 0;
    public int fromY = 0;
    public int toX = 0;
    public int toY = 0;
    
    /**
    *   アプレットが起動した時に呼ばれます。
    */
    public void init()
    {
        System.out.println( "Sample#init()" );
        // マウスイベントを受け取るイベントリスナーを追加します。
        addMouseListener( new NormalMouseListener( this ) );
    }

    /**
    *   再描画される際に呼び出されます。
    */
    public void paint( Graphics g )
    {
        // 下の「Sample#paint()」が出力されるタイミングで、いつ再描画
        // されるかがわかると思います。
        System.out.println( "Sample#paint()" );

        // 赤い直線を引きます。
        g.setColor( Color.red );
        g.drawLine( fromX, fromY, toX, toY );
        // この処理を再描画時に行うため、たとえば「最小化してから
        // 元に戻す」場合にも、またこのpaint()メソッドが呼ばれ、
        // 描画するため、ちゃんと直線が引かれます。
    }
}

/**
*   マウスイベントリスナー
*   これが、マウスイベントを受け取るイベントリスナーです。
*/
class NormalMouseListener implements MouseListener
{
    // 対象のSampleクラス。
    private Sample sample = null;

    /**
    *   コンストラクタ。
    */
    public NormalMouseListener( Sample sample )
    {
        this.sample = sample;
    }

    /**
    *   押されました。
    */
    public void mousePressed( MouseEvent mouseEvent )
    {
        // ドラッグ開始位置のX軸とY軸の位置を取っておきます。
        sample.fromX = mouseEvent.getX();
        sample.fromY = mouseEvent.getY();
    }

    /**
    *   離されました。
    */
    public void mouseReleased( MouseEvent mouseEvent )
    {
        // ドラッグ終了位置のX軸とY軸の位置を取っておきます。
        sample.toX = mouseEvent.getX();
        sample.toY = mouseEvent.getY();
        // 再描画します。
        sample.repaint();
    }

    // その他のメソッドはとりあえずオーバーライドだけします。
    public void mouseClicked( MouseEvent mouseEvent ){}
    public void mouseEntered( MouseEvent mouseEvent ){}
    public void mouseExited( MouseEvent mouseEvent ){}
}
// Sample.java
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

/**
*   Eclipseで試す場合には、「デバッグ」の
*   「Java Applet」として新規に作成してください。
*/
public class Sample extends Applet
{
    // 直線を引く際の開始位置と終了位置。
    // お行儀悪いですがpublicフィールドにします。
    public int fromX = 0;
    public int fromY = 0;
    public int toX = 0;
    public int toY = 0;
    
    /**
    *   アプレットが起動した時に呼ばれます。
    */
    public void init()
    {
        System.out.println( "Sample#init()" );
        // マウスイベントを受け取るイベントリスナーを追加します。
        addMouseListener( new NormalMouseListener( this ) );
    }

    /**
    *   再描画される際に呼び出されます。
    */
    public void paint( Graphics g )
    {
        // 下の「Sample#paint()」が出力されるタイミングで、いつ再描画
        // されるかがわかると思います。
        System.out.println( "Sample#paint()" );

        // 赤い直線を引きます。
        g.setColor( Color.red );
        g.drawLine( fromX, fromY, toX, toY );
        // この処理を再描画時に行うため、たとえば「最小化してから
        // 元に戻す」場合にも、またこのpaint()メソッドが呼ばれ、
        // 描画するため、ちゃんと直線が引かれます。
    }
}

/**
*   マウスイベントリスナー
*   これが、マウスイベントを受け取るイベントリスナーです。
*/
class NormalMouseListener implements MouseListener
{
    // 対象のSampleクラス。
    private Sample sample = null;

    /**
    *   コンストラクタ。
    */
    public NormalMouseListener( Sample sample )
    {
        this.sample = sample;
    }

    /**
    *   押されました。
    */
    public void mousePressed( MouseEvent mouseEvent )
    {
        // ドラッグ開始位置のX軸とY軸の位置を取っておきます。
        sample.fromX = mouseEvent.getX();
        sample.fromY = mouseEvent.getY();
    }

    /**
    *   離されました。
    */
    public void mouseReleased( MouseEvent mouseEvent )
    {
        // ドラッグ終了位置のX軸とY軸の位置を取っておきます。
        sample.toX = mouseEvent.getX();
        sample.toY = mouseEvent.getY();
        // 再描画します。
        sample.repaint();
    }

    // その他のメソッドはとりあえずオーバーライドだけします。
    public void mouseClicked( MouseEvent mouseEvent ){}
    public void mouseEntered( MouseEvent mouseEvent ){}
    public void mouseExited( MouseEvent mouseEvent ){}
}

この単語を含むページ

「みだし」に含まれているページ

「解説」に含まれているページ

「サンプルプログラムとか」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/10/18
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。