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