Javaのpaint()メソッドとrepaint()メソッドの違いをわかりやすく解説
JavaでGUIアプリケーションを開発する際、コンポーネントの描画に関わるpaint()メソッドとrepaint()メソッドは、役割がまったく異なる重要なメソッドです。この記事では、両者の違いと正しい使い方を具体例とともに解説します。
paint()メソッドとrepaint()メソッドの違い
paint()メソッドとは
paint()は、コンポーネントを実際に描画するための処理(描画命令)を記述するメソッドです。Java AWTでは、このメソッドをオーバーライドして独自の描画処理を実装します。
一方、Java SwingではpaintComponent()メソッドをオーバーライドするのが推奨されています。これは、Swingのpaint()が内部で以下の3つのメソッドを順に呼び出す仕組みになっているためです。
- paintBorder():コンポーネントの境界線を描画
- paintComponent():コンポーネント本体を描画
- paintChildren():子コンポーネントを描画
なお、paint()メソッドを直接呼び出すことはできません。再描画が必要な場合は、後述のrepaint()メソッドを使用します。
repaint()メソッドとは
repaint()は、コンポーネントに再描画を要求するためのメソッドです。このメソッドはオーバーライドできません。内部では「update() → paint()」という一連の再描画サイクルを制御しています。
コンポーネントの見た目を変更したものの、サイズ自体には変更がない場合などに、このメソッドを呼び出すことでコンポーネント自身を再描画させることができます。
サンプルコード
次のプログラムは、マウスでクリックした位置に四角形を描画する例です。mousePressed()メソッド内でrepaint()を呼び出し、画面の再描画を促しています。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class PaintRepaintTest extends JPanel implements MouseListener {
private Vector v;
public PaintRepaintTest() {
v = new Vector();
setBackground(Color.white);
addMouseListener(this);
}
public void paint(Graphics g) { // paint()メソッド
super.paint(g);
g.setColor(Color.black);
Enumeration enumeration = v.elements();
while(enumeration.hasMoreElements()) {
Point p = (Point)(enumeration.nextElement());
g.drawRect(p.x-20, p.y-20, 40, 40);
}
}
public void mousePressed(MouseEvent me) {
v.add(me.getPoint());
repaint(); // repaint()メソッドを呼び出し
}
public void mouseClicked(MouseEvent me) {}
public void mouseEntered(MouseEvent me) {}
public void mouseExited(MouseEvent me) {}
public void mouseReleased(MouseEvent me) {}
public static void main(String args[]) {
JFrame frame = new JFrame();
frame.getContentPane().add(new PaintRepaintTest());
frame.setTitle("PaintRepaint Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setSize(375, 250);
frame.setVisible(true);
}
}
プログラムのポイント
- クリックした座標をVectorに追加し、repaint()を呼び出すことで再描画を要求します。
- 実際の描画処理は、システム側から自動的に呼び出されるpaint()メソッド内で行われます。
- このように「repaint()で再描画を依頼 → システムがpaint()を呼び出す」という流れが、Javaの基本的な描画モデルです。
実行結果
上記のプログラムを実行すると、画面をクリックするたびにその位置へ40×40ピクセルの四角形が描画されていきます。クリックのたびにmousePressed()メソッドからrepaint()が呼ばれ、蓄積されたすべての座標に対してpaint()が再描画を行う仕組みです。
まとめ
| paint() | repaint() | |
|---|---|---|
| 主な役割 | コンポーネントの描画処理を定義する | 再描画をシステムに要求する |
| 直接呼び出し | 不可(システムが自動的に呼び出す) | 可能 |
| オーバーライド | 可能(SwingではpaintComponent()を推奨) | 不可 |
| 用途 | 見た目をどう描くかを記述 | 状態変化後に画面を更新したいとき |
このように、「描く内容を書くのがpaint()、描き直しをお願いするのがrepaint()」という関係性を理解しておくと、JavaのGUI描画処理を適切に設計できるようになります。
-
JavaのJFrameとJDialogの違いとは?特徴と使い分けを解説
JavaのSwingには、ウィンドウを表示するためのトップレベルコンテナとしてJFrameとJDialogが用意されています。どちらもよく似た役割を持ちますが、動作や用途には重要な違いがあります。この記事では、それぞれの特徴をサンプルコードとともに解説し、最後に使い分けのポイントをまとめます。 JFrameとは フレームに追加されたコンポーネントは「コンテンツ」として扱われ、contentPaneによって管理されます。JFrameにコンポーネントを追加する際は、フレーム本体ではなくcontentPaneに対して追加する必要があります。 JFrameは、タイトル、境界線、(オプションで)メニュ
-
JavaのGridLayoutとGridBagLayoutの違いを徹底解説!特徴と使い分けのポイント
JavaのAWT/Swingには複数のレイアウトマネージャーが用意されていますが、その中でもGridLayoutとGridBagLayoutは、コンポーネントを格子状(グリッド)に配置するという点でよく似ています。しかし、両者には重要な違いがあります。 GridLayoutは、すべてのコンポーネントを矩形のグリッド内に配置し、領域を同じサイズの長方形に分割して、各コンポーネントをそれぞれのセルの中に収めます。一方、GridBagLayoutは柔軟性の高いレイアウトマネージャーであり、コンポーネントのサイズを揃えることなく、縦方向・横方向に整列させて配置できます。各GridBagLayoutオブ