MouseEvent

広告

ここではMouseEventについて見ていきます。

1.MouseEventを発生させるコンポーネント:

全てのコンポーネント

2.イベントが発生するタイミング:

コンポーネントの上にマウスがある時に、マウスのボタンを押す、など

3.対応するリスナーインターフェース:

java.awt.event.MouseListener
public interface MouseListener extends EventListener

4.コンポーネントに対するリスナーの登録メソッド:

addMouseListener
public void addMouseListener(MouseListener l)

5.アダプタークラス:

java.awt.event.MouseAdapter
public abstract class MouseAdapter extends Object implements MouseListener

MouseListenerインターフェース

MouseListenerインターフェースはマウスイベントを受け取るためのリスナーインタフェースです。マウスイベントを処理するクラスを用意する場合にはこのインタフェースを実装します。実装に必要なメソッドは5つあります。それぞれ異なるマウスの動きに対応したメソッドとなっております。

mouseClicked:

コンポーネント上でマウスボタンをクリック (押してから離す) したときに呼
び出されます。

mousePressed:

コンポーネント上でマウスボタンが押されると呼び出されます。

mouseReleased:

コンポーネント上でマウスボタンが離されると呼び出されます。

mouseEntered:

コンポーネントにマウスが入ると呼び出されます。

mouseExited:

コンポーネントからマウスが出ると呼び出されます。

上記のようにマウスをクリック/マウスボタンを押す/マウスボタンを離す/マウスがコンポーネントの上に入ってくる/マウスがコンポーネントの上から出る、といった5つの状態に各メソッドが対応しています。

このリスナーインターフェースの実装方法は下記のようになります。

public class myListener implements MouseListener{
  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){
    /* 処理したい内容をここに記述する */
  }
}

ではここで簡単なサンプルを作成して試してみます。下記では自分自身にMouseListenerをインプリメントしています。

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

public class SwingTest extends JFrame implements MouseListener{

  protected JList list;
  protected DefaultListModel model;

  public static void main(String[] args){
    SwingTest test = new SwingTest("SwingTest");

    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setVisible(true);
  }

  SwingTest(String title){
    setTitle(title);
    setBounds( 10, 10, 300, 200);

    model = new DefaultListModel();
    list = new JList(model);

    JScrollPane sp = new JScrollPane();
    sp.getViewport().setView(list);
    sp.setPreferredSize(new Dimension(200, 80));

    JButton btn = new JButton("コンポーネント");
    btn.addMouseListener(this);

    JPanel p = new JPanel();
    p.add(btn);
    p.add(sp);

    getContentPane().add(p, BorderLayout.CENTER);
  }

  public void mouseClicked(MouseEvent e){
    model.addElement("mouseClicked");
    list.ensureIndexIsVisible(model.getSize() - 1);
  }

  public void mouseEntered(MouseEvent e){
    model.addElement("mouseEntered");
    list.ensureIndexIsVisible(model.getSize() - 1);
  }

  public void mouseExited(MouseEvent e){
    model.addElement("mouseExited");
    list.ensureIndexIsVisible(model.getSize() - 1);
  }

  public void mousePressed(MouseEvent e){
    model.addElement("mousePressed");
    list.ensureIndexIsVisible(model.getSize() - 1);
  }

  public void mouseReleased(MouseEvent e){
    model.addElement("mouseReleased");
    list.ensureIndexIsVisible(model.getSize() - 1);
  }
}

実行結果は下記のようになります。

MouseEvent

対象となるコンポーネントの上にマウスが来ると、"mouseEntered"イベントが発生します。

MouseEvent

対象となるコンポーネントからマウスがでると、"mouseExited"イベントが発生します。

MouseEvent

対象となるコンポーネント上でマウスを押すと、"mousePressed"イベントが発生します。

MouseEvent

対象となるコンポーネント上でマウスを離すと、"mouseReleased"イベントが発生し、そして"mouseClicked"イベントも発生します。mouseClickedイベントはマウスのボタンを押して離すという一連の動作の後で発生します。

MouseEvent

MouseAdapterクラス

先ほどのようにMouseListenerインターフェースを実装する場合は、必要な5つのメソッドを全て定義しなければコンパイル時にエラーとなってしまいます。ただ実際には使わないメソッドもあると思いますので、実際にはMouseAdapterクラスを使うと便利です。

  • java.lang.Object
  • java.awt.event.MouseAdapter
  • public abstract class MouseAdapter extends Object implements MouseListener

MouseAdapterクラスというのは、MouseListenerインターフェースを実装してあるクラスでメソッドが全て空のクラスです。例えば下記のようなクラスです。

public class MouseAdapter implements MouseListener{
  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){}
}

MouseAdapterクラスを継承し、実際に必要なメソッドだけを自分で再度定義するだけで、MouseEventを取り扱うことができます。

public class myListener extends MouseAdapter{
  public void mouseClicked(MouseEvent e){
    /* 必要なメソッドだけ自分で再度定義 */
  }
}

このようにすることで、自分でMouseListenerインターフェースを実装するよりも簡単に記述することができます。注意点としてはMouseAdapterはクラスなのでextendsする必要があるという点だけです。

では実際に試して見ます。

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

public class SwingTest extends JFrame{

  protected JList list;
  protected DefaultListModel model;

  public static void main(String[] args){
    SwingTest test = new SwingTest("SwingTest");

    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setVisible(true);
  }

  SwingTest(String title){
    setTitle(title);
    setBounds( 10, 10, 300, 200);

    model = new DefaultListModel();
    list = new JList(model);

    JScrollPane sp = new JScrollPane();
    sp.getViewport().setView(list);
    sp.setPreferredSize(new Dimension(200, 80));

    JButton btn = new JButton("コンポーネント");
    btn.addMouseListener(new myListener());

    JPanel p = new JPanel();
    p.add(btn);
    p.add(sp);

    getContentPane().add(p, BorderLayout.CENTER);
  }

  public class myListener extends MouseAdapter{
    public void mouseClicked(MouseEvent e){
      model.addElement("mouseClicked");
      list.ensureIndexIsVisible(model.getSize() - 1);
    }
  }
}

実行結果は下記のようになります。

MouseAdapter

今回は"mouseClicked"だけを処理しています。

MouseEventクラス

ではMouseEventクラスについても見ていきます。クラス図を見て下さい。

  • java.lang.Object
  • java.util.EventObject
  • java.awt.AWTEvent
  • java.awt.event.ComponentEvent
  • java.awt.event.InputEvent
  • java.awt.event.MouseEvent
  • public class MouseEvent extends InputEvent

MouseEventクラスのメソッドとしては下記のようなものが用意されています。

メソッドの概要
int getClickCount()
このイベントに関連したマウスクリック数を返します。
int getButton()
アクションイベントの発生中に押された修飾キーを返します。
Point getPoint()
発生元のコンポーネントを基準とする、イベントの相対 x、y 座標値を返します。

1つ1つ見てみましょう。

getClickCountメソッド

getClickCountメソッドは下記の通り定義されています。

このイベントに関連したマウスクリック数を返します。

戻り値:
  クリック数を表す整数値

getClickCountメソッドはクリック数を調べるのに使います。クリックとクリックの間で、間があかない一定期間(何秒なのかは不明です)の間に何回クリックされたかを調べることができるので、ダブルクリックなどの判別などに使います。

簡単なサンプルで試して見ます。

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

public class SwingTest extends JFrame{

  protected JList list;
  protected DefaultListModel model;

  public static void main(String[] args){
    SwingTest test = new SwingTest("SwingTest");

    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setVisible(true);
  }

  SwingTest(String title){
    setTitle(title);
    setBounds( 10, 10, 300, 200);

    model = new DefaultListModel();
    list = new JList(model);

    JScrollPane sp = new JScrollPane();
    sp.getViewport().setView(list);
    sp.setPreferredSize(new Dimension(200, 80));

    JButton btn = new JButton("コンポーネント");
    btn.addMouseListener(new myListener());

    JPanel p = new JPanel();
    p.add(btn);
    p.add(sp);

    getContentPane().add(p, BorderLayout.CENTER);
  }

  public class myListener extends MouseAdapter{
    public void mouseClicked(MouseEvent e){
      model.addElement("mouseClicked" + e.getClickCount());
      list.ensureIndexIsVisible(model.getSize() - 1);
    }
  }
}

実行結果は下記のようになります。ゆっくりとクリックした場合は、何度クリックしてもカウントは"1"ですが

MouseEvent

連続してクリックをすると、クリックカウントが加算されていきます。

MouseEvent

getButtonメソッド

getButtonメソッドは下記のように定義されています。

状態が変更されたマウスボタンがある場合、そのマウスボタンを返します。

戻り値:
  定数 NOBUTTON、BUTTON1、BUTTON2、またはBUTTON3 のいずれか

マウスには左ボタンの他に右ボタンなどもあります。それぞれのボタンの状態が変更された場合、それがどのボタンかを調べるのに使います。これでどのボタンが押されたのかを判別することができます。
4つの値が定義されています。

java.awt.event.MouseEvent
public static final int BUTTON1  1
public static final int BUTTON2  2
public static final int BUTTON3  3
public static final int NOBUTTON 0

実際に試したみたところ、私の3ボタンマウスですと、左ボタンが"1"、右ボタンが"3"、真ん中の小さいボタンが"2"でした。

では簡単なサンプルで試して見ます。

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

public class SwingTest extends JFrame{

  protected JList list;
  protected DefaultListModel model;

  public static void main(String[] args){
    SwingTest test = new SwingTest("SwingTest");

    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setVisible(true);
  }

  SwingTest(String title){
    setTitle(title);
    setBounds( 10, 10, 300, 200);

    model = new DefaultListModel();
    list = new JList(model);

    JScrollPane sp = new JScrollPane();
    sp.getViewport().setView(list);
    sp.setPreferredSize(new Dimension(200, 80));

    JButton btn = new JButton("コンポーネント");
    btn.addMouseListener(new myListener());

    JPanel p = new JPanel();
    p.add(btn);
    p.add(sp);

    getContentPane().add(p, BorderLayout.CENTER);
  }

  public class myListener extends MouseAdapter{
    public void mouseClicked(MouseEvent e){
      model.addElement("mouseClicked " + e.getButton());
      list.ensureIndexIsVisible(model.getSize() - 1);
    }
  }
}

実行結果は下記のようになります。

getButton

押されたボタンに応じて、ボタンの種類も合わせて表示しています。

getPointメソッド

getPointメソッドは下記のように定義されています。

発生元のコンポーネントを基準とする、イベントの相対 x、y 座標値を返し
ます。 

戻り値:
  発生元のコンポーネントを基準とする X 座標および Y 座標を保持する 
  Point オブジェクト

コンポーネントのどの位置でイベントが発生したかの座標を取得することができます。

これもサンプルで試してみます。

import javax.swing.*;
import java.awt.event.*;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Point;

public class SwingTest extends JFrame{

  protected JList list;
  protected DefaultListModel model;

  public static void main(String[] args){
    SwingTest test = new SwingTest("SwingTest");

    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setVisible(true);
  }

  SwingTest(String title){
    setTitle(title);
    setBounds( 10, 10, 300, 200);

    model = new DefaultListModel();
    list = new JList(model);

    JScrollPane sp = new JScrollPane();
    sp.getViewport().setView(list);
    sp.setPreferredSize(new Dimension(200, 80));

    JButton btn = new JButton("コンポーネント");
    btn.addMouseListener(new myListener());

    JPanel p = new JPanel();
    p.add(btn);
    p.add(sp);

    getContentPane().add(p, BorderLayout.CENTER);
  }

  public class myListener extends MouseAdapter{
    public void mouseClicked(MouseEvent e){
      Point p = e.getPoint();
      model.addElement("mouseClicked " + "x:" + p.getX() + ",y:" + p.getY());
      list.ensureIndexIsVisible(model.getSize() - 1);
    }
  }
}

実行結果は下記のようになります。

getPoint

実際に試してみると、対象となるコンポーネントの左上を(0,0)とした場合の座標を取得できるようです。

getComponentメソッド

MouseEventクラスには、発生元のコンポーネントを調べるメソッドは用意されていませんが、親クラスのComponentEventクラスでgetComponentメソッドが用意されています。

getComponentメソッドは下記のように定義されています。

イベントの発生元を返します。 

戻り値:
  イベントの発生元の Component オブジェクト、または null (オブジェクト
    が Component でない場合)

このメソッドを使うことで、発生元のコンポーネントを調べることができます。

( Written by Tatsuo Ikura )