Download the JDK
Search the Tutorials
Hide the TOC
Trail: Creating a GUI with JFC/Swing
Lesson: Writing Event Listeners
Section: Implementing Listeners for Commonly Handled Events
Writing Event Listeners
Introduction to Event Listeners
General Information about Writing Event Listeners
Listeners Supported by Swing Components
Implementing Listeners for Commonly Handled Events
How to Write an Action Listener
How to Write a Caret Listener
How to Write a Change Listener
How to Write a Component Listener
How to Write a Container Listener
How to Write a Document Listener
How to Write a Focus Listener
How to Write an Internal Frame Listener
How to Write an Item Listener
How to Write a Key Listener
How to Write a List Data Listener
How to Write a List Selection Listener
How to Write a Mouse Listener
How to Write a Mouse-Motion Listener
How to Write a Mouse-Wheel Listener
How to Write a Property Change Listener
How to Write a Table Model Listener
How to Write a Tree Expansion Listener
How to Write a Tree Model Listener
How to Write a Tree Selection Listener
How to Write a Tree-Will-Expand Listener
How to Write an Undoable Edit Listener
How to Write Window Listeners
Listener API Table
Solving Common Event-Handling Problems
Home Page > Creating a GUI with JFC/Swing > Writing Event Listeners
« Previous • Trail • Next »
How to Write a Mouse-Motion Listener

> Mouse-motion events tell you when the user uses the mouse (or a similar input device) to move the onscreen cursor. For information on listening for other kinds of mouse events, such as clicks, see How to Write a Mouse Listener. For information on listening for mouse-wheel events, see How to Write a Mouse Wheel Listener. If your program needs to detect both mouse events and mouse-motion events, you can use Swing's convenient `MouseInputAdapter` class, which implements both `MouseListener` and `MouseMotionListener`.

> The following demo contains a mouse-motion listener. It's exactly like the example in How to Write a Mouse Listener, except for substituting `MouseMotionListener` for `MouseListener`, implementing the `mouseDragged` and `mouseMoved` methods instead of the mouse listener methods, and displaying coordinates instead of numbers of clicks.

> > Try this:
> > 1. Run MouseMotionEventDemo using JavaTM Web Start. Or, to compile and run the example yourself, consult the example index.
> > 2. Move the cursor into the yellow rectangle at the top of the window.
> >    You'll see one or more mouse-moved events.
> > 3. Press and hold the mouse button, and then move the mouse so that the cursor is outside the yellow rectangle.
> >    You'll see mouse-dragged events.

> Here is the code from MouseMotionEventDemo.java that implements the mouse-motion event handling:

> >     public class MouseMotionEventDemo extends JPanel
> >                                       implements MouseMotionListener {
> >         //...in initialization code:
> >             //Register for mouse events on blankArea and panel.
> >             blankArea.addMouseMotionListener(this);
> >             addMouseMotionListener(this);
> >             ...
> >         }

> >         public void mouseMoved(MouseEvent e) {
> >            saySomething("Mouse moved", e);
> >         }

> >         public void mouseDragged(MouseEvent e) {
> >            saySomething("Mouse dragged", e);
> >         }

> >         void saySomething(String eventDescription, MouseEvent e) {
> >             textArea.append(eventDescription
> >                             + " (" + e.getX() + "," + e.getY() + ")"
> >                             + " detected on "
> >                             + e.getComponent().getClass().getName()
> >                             + newline);
> >         }
> >     }

> A more interesting example is `SelectionDemo`, which is discussed in Introduction to Painting Concepts. The program draws a rectangle illustrating the user's current dragging. To do this, it must implement an event handler for three kinds of mouse events: mouse presses, mouse drags, and mouse releases. To be informed of all these events, the handler must implement both the `MouseListener` and `MouseMotionListener` interfaces, and be registered as both a mouse listener and a mouse-motion listener. To avoid having to define empty methods, the handler doesn't implement either listener interface directly. Instead, it extends `MouseInputAdapter`, as the following code snippet shows.

> [PENDING: When this example has been updated, check the code.]

> >     ...//where initialization occurs:
> >         MyListener myListener = new MyListener();
> >         addMouseListener(myListener);
> >         addMouseMotionListener(myListener);
> >     ...
> >     class MyListener extends MouseInputAdapter {
> >         public void mousePressed(MouseEvent e) {
> >             int x = e.getX();
> >             int y = e.getY();
> >             currentRect = new Rectangle(x, y, 0, 0);
> >             updateDrawableRect(getWidth(), getHeight());
> >             repaint();
> >         }

> >         public void mouseDragged(MouseEvent e) {
> >             updateSize(e);
> >         }

> >         public void mouseReleased(MouseEvent e) {
> >             updateSize(e);
> >         }

> >         void updateSize(MouseEvent e) {
> >             int x = e.getX();
> >             int y = e.getY();
> >             ...
> >             repaint(...);
> >         }
> >     }

### The Mouse-Motion Listener API

> The MouseMotionListener Interface

> The corresponding adapter class is `MouseMotionAdapter`.

> Method | Purpose
> --- | ---
> mouseDragged(MouseEvent) | Called in response to the user moving the mouse while holding a mouse button down. This event is fired by the component that fired the most recent mouse-pressed event, even if the cursor is no longer over that component.
> mouseMoved(MouseEvent) | Called in response to the user moving the mouse with no mouse buttons pressed. This event is fired by the component that's currently under the cursor.

> Each mouse-motion event method has a single parameter — and it's not called `MouseMotionEvent`! Instead, each mouse-motion event method uses a `MouseEvent` argument. See The MouseEvent API for information about using `MouseEvent` objects.

### Examples that Use Mouse-Motion Listeners

> The following table lists the examples that use mouse-motion listeners.

> Example | Where Described | Notes
> --- | --- | ---
> `MouseMotionEventDemo` | This section | Reports all mouse motion events that occur within a blank panel to demonstrate the circumstances under which mouse motion events are fired.
> `LayeredPaneDemo` and `LayeredPaneDemo2` | How to Use Layered Panes | Moves an image of Duke around within a layered pane in response to mouse motion events.
> `SelectionDemo` | Introduction to Painting Concepts | Lets the user drag a rectangle to select a portion of an image. Uses a subclass of `MouseInputAdapter` to listen to both mouse events and mouse-motion events.
> `GlassPaneDemo` | How to Use Root Panes | Uses a subclass of `MouseInputAdapter` to listen to mouse events and mouse-motion events on the root pane's glass pane. Redispatches the events to underlying components.
> `ScrollDemo` | How to Use Scroll Panes | The label subclass, ScrollablePicture, uses a mouse-motion listener to allow the user to scroll the picture even when the user drags outside the window.

« Previous • Trail • Next »
Previous page: How to Write a Mouse Listener
Next page: How to Write a Mouse-Wheel Listener