マウスに関するイベントは、コンポーネントにイベントリスナーを登録することで、そのコンポーネント上でイベントが起きたときに登録したリスナーのメソッドが呼ばれる。
|
| リスナー | メソッド | 概要 |
|---|---|---|
| MouseListener | mouseEntered | コンポーネントの上にマウスカーソルが入ってきたときに呼ばれる。 |
| mouseExited | コンポーネントの外にマウスカーソルが出るときに呼ばれる。 | |
| mouseClicked | コンポーネント上でマウスボタンをクリックした(押して離した)ときに呼ばれる。 (press,releaseも別途呼ばれる) |
|
| mousePressed | コンポーネント上でマウスボタンを押したときに呼ばれる。 (右ボタンも左ボタンも、同じく当メソッドが呼ばれる) |
|
| mouseReleased | コンポーネント上でマウスボタンを離したときに呼ばれる。 | |
| MouseMotionListener | mouseMoved | コンポーネント上でマウスを動かしたときに呼ばれる。 (ドラッグ中は呼ばれない) |
| mouseDragged | ドラッグ中にコンポーネント上でマウスを動かしたときに呼ばれる。 | |
| MouseWheelListener | mouseWheelMoved | マウスのホイールを回転させたときに呼ばれる。 |
上記のリスナーのインターフェースを空メソッドで実装したアダプタークラスも用意されている。
MouseAdapter、MouseMotionAdapter
MouseInputAdapter(MouseListenerとMouseMotionListenerを実装)
これらのアダプタークラスで実装されているリスナーは、jreのバージョンによって多少異なる模様。
リスナーの登録には、コンポーネントのaddMouseListener/addMouseMotionListener/addMouseWheelListenerを呼び出す。
Component c = 〜;
c.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
//マウスカーソルを手の形に変える
Cursor c = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
Component p = (Component) e.getSource();
p.setCursor(c);
}
public void mouseReleased(MouseEvent e) {
//マウスカーソルをデフォルトに戻す
Cursor c = Cursor.getDefaultCursor();
Component p = (Component) e.getSource();
p.setCursor(c);
}
});
リスナーのメソッドが呼ばれると、その引数MouseEvent(ホイールはMouseWheelEvent)に色々な情報が入っている。
| 情報 | 方法 | 更新日 |
|---|---|---|
| イベントが発生したコンポーネント | Component c = (Component)e.getSource(); |
|
| マウスカーソルの座標 | Point pt = e.getPoint(); |
|
| 左ボタンが押されているかどうか | boolean l = SwingUtilities.isLeftMouseButton(e); |
|
| 右ボタンが押されているかどうか | boolean r = SwingUtilities.isRightMouseButton(e); |
|
| 中ボタンが押されているかどうか | boolean m = SwingUtilities.isMiddleMouseButton(e); |
|
| マウスボタンのクリック数 (シングルクリックなら1、ダブルクリックなら2) トリプルクリックなら3(笑) |
int ct = e.getClickCount(); |
|
| Ctrlキーが押されているかどうか | boolean c = e.isControlDown(); |
|
| Shiftキーが押されているかどうか | boolean s = e.isShiftDown(); |
|
| Altキーが押されているかどうか | boolean a = e.isAltDown(); |
|
| ポップアップメニュー表示の開始かどうか | boolean a = e.isPopupTrigger(); |
2009-04-11 |
イベントを処理したのでデフォルトのマウス処理を行いたくない場合は、以下のようにconsumeメソッドを呼んでからイベント処理を終了する。
public void mousePressed(MouseEvent e) {
〜
e.consume();
}
マウスイベントではMouseEventクラスにマウスカーソルの座標が入ってくるので問題ない。[2009-04-11]
マウスイベント以外でマウスカーソルの座標を取得したい(例えばコンテキストメニューキーを押した際にマウスカーソルの位置にポップアップメニューを出す)場合、
JDK1.5以降ならComponent#getMousePosition()が使える。
(内部では、JDK1.5で新設されたjava.awt.MouseInfoやjava.awt.PointerInfoといったクラスが使われている)
Component c = 〜; Point pos = c.getMousePosition(); System.out.println(pos);
戻り値は、マウスカーソルがそのコンポーネント上に無い場合はnullになるらしい。
(マウスがそのコンポーネント上に乗っているかどうかを判定したいだけなら、nullかどうかをチェックするだけで済む)