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:
void mouseClicked(MouseEvent e)
コンポーネント上でマウスボタンをクリック (押してから離す) したときに呼 び出されます。
mousePressed:
void mousePressed(MouseEvent e)
コンポーネント上でマウスボタンが押されると呼び出されます。
mouseReleased:
void mouseReleased(MouseEvent e)
コンポーネント上でマウスボタンが離されると呼び出されます。
mouseEntered:
void mouseEntered(MouseEvent e)
コンポーネントにマウスが入ると呼び出されます。
mouseExited:
void mouseExited(MouseEvent e)
コンポーネントからマウスが出ると呼び出されます。
上記のようにマウスをクリック/マウスボタンを押す/マウスボタンを離す/マウスがコンポーネントの上に入ってくる/マウスがコンポーネントの上から出る、といった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); } }
実行結果は下記のようになります。
対象となるコンポーネントの上にマウスが来ると、"mouseEntered"イベントが発生します。
対象となるコンポーネントからマウスがでると、"mouseExited"イベントが発生します。
対象となるコンポーネント上でマウスを押すと、"mousePressed"イベントが発生します。
対象となるコンポーネント上でマウスを離すと、"mouseReleased"イベントが発生し、そして"mouseClicked"イベントも発生します。mouseClickedイベントはマウスのボタンを押して離すという一連の動作の後で発生します。
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); } } }
実行結果は下記のようになります。
今回は"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メソッドは下記の通り定義されています。
public int 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"ですが
連続してクリックをすると、クリックカウントが加算されていきます。
getButtonメソッド
getButtonメソッドは下記のように定義されています。
public int 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); } } }
実行結果は下記のようになります。
押されたボタンに応じて、ボタンの種類も合わせて表示しています。
getPointメソッド
getPointメソッドは下記のように定義されています。
public Point 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); } } }
実行結果は下記のようになります。
実際に試してみると、対象となるコンポーネントの左上を(0,0)とした場合の座標を取得できるようです。
getComponentメソッド
MouseEventクラスには、発生元のコンポーネントを調べるメソッドは用意されていませんが、親クラスのComponentEventクラスでgetComponentメソッドが用意されています。
getComponentメソッドは下記のように定義されています。
public Component getComponent()
イベントの発生元を返します。 戻り値: イベントの発生元の Component オブジェクト、または null (オブジェクト が Component でない場合)
このメソッドを使うことで、発生元のコンポーネントを調べることができます。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。