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

JavaにおけるMouseListenerとMouseMotionListenerの違いを徹底解説

Javaでマウスイベントを処理する際、マウスが静止している状態(クリックや押下など)のイベントにはMouseListenerインターフェースを実装し、マウスが動いている状態(移動やドラッグ)のイベントにはMouseMotionListenerインターフェースを実装します。両者の違いを理解しておくと、目的に応じた適切なリスナーを選択できるようになります。


MouseListenerとは

MouseEventは、ソースオブジェクト上でマウスボタン(左ボタンまたは右ボタン)を押したとき、離したとき、クリックした(押してから離す一連の動作)ときに発生します。また、マウスポインタがソースオブジェクト上に入った(enter)とき、およびオブジェクトから出た(exit)ときにも発生します。

MouseListenerインターフェースは、以下の5つの抽象メソッドを宣言しています。

構文

public void mouseClicked(MouseEvent evt)
public void mousePressed(MouseEvent evt)
public void mouseReleased(MouseEvent evt)
public void mouseEntered(MouseEvent evt)
public void mouseExited(MouseEvent evt)

各メソッドの役割

  • mouseClicked:ボタンが押されて離された(クリック完了)ときに呼ばれる
  • mousePressed:ボタンが押された瞬間に呼ばれる
  • mouseReleased:ボタンが離された瞬間に呼ばれる
  • mouseEntered:ポインタがコンポーネントの領域に入ったときに呼ばれる
  • mouseExited:ポインタがコンポーネントの領域から出たときに呼ばれる

コード例

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

public class MouseListenerTest extends JFrame implements MouseListener {
   private JTextField tfMouseX, tfMouseY;

   public MouseListenerTest() {
      setLayout(new FlowLayout());
      add(new Label("X-Click: "));
      tfMouseX = new JTextField(10);
      tfMouseX.setEditable(false);
      add(tfMouseX);

      add(new Label("Y-Click: "));
      tfMouseY = new JTextField(10);
      tfMouseY.setEditable(false);
      add(tfMouseY);

      addMouseListener(this);

      setTitle("MouseListener Test");
      setLocationRelativeTo(null);
      setSize(350, 100);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setVisible(true);
   }

   public static void main(String[] args) {
      new MouseListenerTest();
   }

   @Override
   public void mouseClicked(MouseEvent evt) {
      tfMouseX.setText(evt.getX() + "");
      tfMouseY.setText(evt.getY() + "");
   }

   // コンパイルを通すために空の実装を用意
   @Override public void mousePressed(MouseEvent evt) { }
   @Override public void mouseReleased(MouseEvent evt) { }
   @Override public void mouseEntered(MouseEvent evt) { }
   @Override public void mouseExited(MouseEvent evt) { }
}

実行結果

JavaにおけるMouseListenerとMouseMotionListenerの違いを徹底解説

MouseMotionListenerとは

ソースオブジェクト上でマウスポインタを移動させたりドラッグしたりした場合にも、MouseEventが発生します。ただし、これらのイベント(mouse-move/mouse-drag)を処理するには、MouseMotionListenerを使用する必要があります。

MouseMotionListenerインターフェースは、以下の2つの抽象メソッドを宣言しています。

構文

public void mouseDragged(MouseEvent e)
public void mouseMoved(MouseEvent e)

各メソッドの役割

  • mouseDragged:ボタンを押しながらマウスをドラッグしている間、継続的に呼ばれる
  • mouseMoved:ボタンを押さずにマウスを移動している間、継続的に呼ばれる

コード例

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

public class MouseMotionListenerTest extends JFrame implements MouseListener, MouseMotionListener {
   private JTextField tfMouseClickX, tfMouseClickY;
   private JTextField tfMousePositionX, tfMousePositionY;

   public MouseMotionListenerTest() {
      setLayout(new FlowLayout());
      add(new Label("X-Click: "));
      tfMouseClickX = new JTextField(10);
      tfMouseClickX.setEditable(false);
      add(tfMouseClickX);

      add(new Label("Y-Click: "));
      tfMouseClickY = new JTextField(10);
      tfMouseClickY.setEditable(false);
      add(tfMouseClickY);

      add(new JLabel("X-Position: "));
      tfMousePositionX = new JTextField(10);
      tfMousePositionX.setEditable(false);
      add(tfMousePositionX);

      add(new JLabel("Y-Position: "));
      tfMousePositionY = new JTextField(10);
      tfMousePositionY.setEditable(false);
      add(tfMousePositionY);

      addMouseListener(this);
      addMouseMotionListener(this);

      setTitle("MouseMotionListener Test");
      setSize(400, 120);
      setLocationRelativeTo(null);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setVisible(true);
   }

   public static void main(String[] args) {
      new MouseMotionListenerTest();
   }

   @Override
   public void mouseClicked(MouseEvent evt) {
      tfMouseClickX.setText(evt.getX() + "");
      tfMouseClickY.setText(evt.getY() + "");
   }

   // コンパイルを通すために空の実装を用意
   @Override public void mousePressed(MouseEvent evt) { }
   @Override public void mouseReleased(MouseEvent evt) { }
   @Override public void mouseEntered(MouseEvent evt) { }
   @Override public void mouseExited(MouseEvent evt) { }

   @Override
   public void mouseMoved(MouseEvent evt) {
      tfMousePositionX.setText(evt.getX() + "");
      tfMousePositionY.setText(evt.getY() + "");
   }

   // コンパイルを通すために空の実装を用意
   @Override public void mouseDragged(MouseEvent evt) { }
}

実行結果

JavaにおけるMouseListenerとMouseMotionListenerの違いを徹底解説

両者の違いまとめ

比較項目MouseListenerMouseMotionListener
対象となるイベントクリック・押下・解放・進入・退出移動・ドラッグ
抽象メソッドの数5個2個
マウスの状態静止している状態動いている状態
主な用途クリック操作や出入りの検出ポインタ位置のリアルタイム追跡

このように、MouseListenerは「押す・離す・クリックする・入る・出る」といった静的なマウス操作を扱い、MouseMotionListenerは「移動・ドラッグ」といった動的なマウス操作を扱います。両者は排他的なものではなく、上記の例のように同時に実装することも可能です。用途に応じて適切に使い分けることで、より直感的で操作性の高い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オブ