人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

マウスクリック

マウスで画面をクリックすると点が描かれるプログラムを作ります。マウスはキーボードと並んで基本的な入力インタフェースなので簡単なプログラムを書いて慣れておくといいです。

mouse_click.jar

クリックイベント

マウスのクリックイベントを検出するにはまずMouseListenerインタフェースをimplementsし登録します。

    class MainPanel extends JPanel implements MouseListener {
        public MainPanel() {
            ・・・
            // MouseListenerを登録
            addMouseListener(this);
        }
    }

addMouseListener()の引数thisはこのクラス(MainPanel)がMouseListenerをimplementsしていることを表しています。マウス処理専用のクラスを作ることも可能です。

次に下の5つのマウスイベントハンドラを定義します。

    // マウスをクリックしたとき呼ばれる
    public void mouseClicked(MouseEvent e) {}

    // マウスがウィンドウ内に入ったとき呼ばれる
    public void mouseEntered(MouseEvent e) {}

    // マウスがウィンドウ外に出たとき呼ばれる
    public void mouseExited(MouseEvent e) {}

    // マウスボタンが押されたとき呼ばれる
    public void mousePressed(MouseEvent e) {}

    // マウスボタンが離されたとき呼ばれる
    public void mouseReleased(MouseEvent e) {}

今回はボタンが押されたとき点が描かれるようにしたいのでmouseClicked()の処理だけ書きます。ちなみにマウスをクリックしたときはmousePressed()とmouseReleased()も呼ばれますが中に何も書かなければ何もおきません。

    public void mouseClicked(MouseEvent e) {
        // クリックした座標を得る
        int x = e.getX();
        int y = e.getY();
        // pointListに登録
        pointList.add(new Point(x, y));
        
        repaint();
    }

マウスをクリックした場合、mouseClicked()の引数MouseEvent eを使うことでいろんな情報が引き出せます。たとえば、getX()、getY()でマウスクリックされた位置を得られます。プログラムでは得られた位置からPointオブジェクトを作り、ArrayListに追加しています。

注意すべきなのはmouseClicked()の中で直接描画していないことです。mouseClicked()ではどの位置に点があるかをArrayListに記録するだけです。記録された点の描画はpaintComponent()で行います。描画処理はpaintComponent()に集中させるほうが好ましいです

paintComponent()では追加された点の位置を元に点を描いています。

    // pointListに入っている点の場所に点を描く
    for (int i=0; i<pointList.size(); i++) {
        Point p = (Point)pointList.get(i);
        g.fillOval(p.x-SIZE/2, p.y-SIZE/2, SIZE, SIZE);
    }