Java
 Computer >> コンピューター >  >> プログラミング >> Java

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描画処理を適切に設計できるようになります。

  1. JavaのJFrameとJDialogの違いとは?特徴と使い分けを解説

    JavaのSwingには、ウィンドウを表示するためのトップレベルコンテナとしてJFrameとJDialogが用意されています。どちらもよく似た役割を持ちますが、動作や用途には重要な違いがあります。この記事では、それぞれの特徴をサンプルコードとともに解説し、最後に使い分けのポイントをまとめます。 JFrameとは フレームに追加されたコンポーネントは「コンテンツ」として扱われ、contentPaneによって管理されます。JFrameにコンポーネントを追加する際は、フレーム本体ではなくcontentPaneに対して追加する必要があります。 JFrameは、タイトル、境界線、(オプションで)メニュ

  2. JavaのGridLayoutとGridBagLayoutの違いを徹底解説!特徴と使い分けのポイント

    JavaのAWT/Swingには複数のレイアウトマネージャーが用意されていますが、その中でもGridLayoutとGridBagLayoutは、コンポーネントを格子状(グリッド)に配置するという点でよく似ています。しかし、両者には重要な違いがあります。 GridLayoutは、すべてのコンポーネントを矩形のグリッド内に配置し、領域を同じサイズの長方形に分割して、各コンポーネントをそれぞれのセルの中に収めます。一方、GridBagLayoutは柔軟性の高いレイアウトマネージャーであり、コンポーネントのサイズを揃えることなく、縦方向・横方向に整列させて配置できます。各GridBagLayoutオブ