画像のクリックを検出する方法(JDK1.4.1)

フレームのpaintメソッド内で直接画像をdrawImageするのではなく、
画像を表示するためのコンポーネントを用意して、そのコンポーネントを
フレームにaddしてやるところがポイント。

・ソース

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 * 画像のクリックを検出するサンプル。
 * 画像がクリックされたら、何番目の画像がクリックされたかをポップアップ表示する。
 */
public class ImageClick{
    public static void main(String[] args){
        ImageClickFrame frame = new ImageClickFrame();
        frame.show();
    }
}


/**
 * 画像クリック検出サンプル。
 * フレームクラス。
 */
class ImageClickFrame extends JFrame{
    /** 画像の数 */
    private final int IMAGE_COUNT = 3;
    /** 表示する画像 */
    private Image[] image;
    /** 画像を貼り付けるコンポーネント */
    private ImageClickComponent[] component;
    /** マウスアダプタ */
    MouseAdapter mouseAdapter = new MouseAdapter(){
                                    public void mouseClicked(MouseEvent e){
                                        clicked(e);
                                    }
                                };

    /**
     * コンストラクタ
     */
    public ImageClickFrame(){
        // Window を閉じる為のリスナ
        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });
        // マウスリスナを登録
        getContentPane().addMouseListener(mouseAdapter);
        // サイズ設定
        setSize(150, 150);
        // 背景色設定
        getContentPane().setBackground(Color.white);
        // レイアウト設定
        getContentPane().setLayout(new FlowLayout());
        // 画像読み込み
        image = new Image[IMAGE_COUNT];
        component = new ImageClickComponent[IMAGE_COUNT];
        Toolkit tk = Toolkit.getDefaultToolkit();
        for(int i = 0 ; i < IMAGE_COUNT ; i++){
            // 画像読み込み
            image[i] = tk.getImage("image" + (i + 1) + ".png");
            // 画像表示用コンポーネント作成
            component[i] = new ImageClickComponent(image[i]);
            // コンポーネントをフレームに追加
            getContentPane().add(component[i]);
        }
    }

    /**
     * マウスがクリックされた時の処理
     * @param e マウスイベント
     */
    private void clicked(MouseEvent e){
        for(int i = 0 ; i < IMAGE_COUNT ; i++)
        {
            // コンポーネントの表示位置を取得する
            Rectangle rect = null;
            rect = component[i].getBounds(rect);
            // コンポーネントの表示位置内でマウスがクリックされていたら
            if (rect.contains(e.getX(), e.getY())){
                JOptionPane.showMessageDialog(this, (i+1)+"番目をクリック");
            }
        }
    }
}


/**
 * 画像表示用のコンポーネント。
 * コンストラクタで画像を受け取り、paintメソッドでそれを表示するだけ。
 */
class ImageClickComponent extends JComponent{
    /** 表示する画像 */
    private Image image;

    /**
     * コンストラクタ
     * @param i 表示する画像
     */
    public ImageClickComponent(Image i){
        super();
        image = i;
        Dimension dim = new Dimension(50, 50);
        this.setSize(dim);
        this.setPreferredSize(dim);
    }

    /**
     * 描画処理。
     * @param g Graphicsオブジェクト
     */
    public void paint(Graphics g){
        g.drawImage(image, 0, 0, this);
    }
}


・画像
(image1.png)


(image2.png)


(image3.png)