/*
 * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package java.awt.event;

import java.awt.Component;
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import java.awt.Toolkit;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.awt.IllegalComponentStateException;
import java.awt.MouseInfo;

import sun.awt.AWTAccessor;
import sun.awt.SunToolkit;

An event which indicates that a mouse action occurred in a component. A mouse action is considered to occur in a particular component if and only if the mouse cursor is over the unobscured part of the component's bounds when the action happens. For lightweight components, such as Swing's components, mouse events are only dispatched to the component if the mouse event type has been enabled on the component. A mouse event type is enabled by adding the appropriate mouse-based EventListener to the component (MouseListener or MouseMotionListener), or by invoking Component.enableEvents(long) with the appropriate mask parameter (AWTEvent.MOUSE_EVENT_MASK or AWTEvent.MOUSE_MOTION_EVENT_MASK). If the mouse event type has not been enabled on the component, the corresponding mouse events are dispatched to the first ancestor that has enabled the mouse event type.

For example, if a MouseListener has been added to a component, or enableEvents(AWTEvent.MOUSE_EVENT_MASK) has been invoked, then all the events defined by MouseListener are dispatched to the component. On the other hand, if a MouseMotionListener has not been added and enableEvents has not been invoked with AWTEvent.MOUSE_MOTION_EVENT_MASK, then mouse motion events are not dispatched to the component. Instead the mouse motion events are dispatched to the first ancestors that has enabled mouse motion events.

This low-level event is generated by a component object for:

  • Mouse Events
    • a mouse button is pressed
    • a mouse button is released
    • a mouse button is clicked (pressed and released)
    • the mouse cursor enters the unobscured part of component's geometry
    • the mouse cursor exits the unobscured part of component's geometry
  • Mouse Motion Events
    • the mouse is moved
    • the mouse is dragged

A MouseEvent object is passed to every MouseListener or MouseAdapter object which is registered to receive the "interesting" mouse events using the component's addMouseListener method. (MouseAdapter objects implement the MouseListener interface.) Each such listener object gets a MouseEvent containing the mouse event.

A MouseEvent object is also passed to every MouseMotionListener or MouseMotionAdapter object which is registered to receive mouse motion events using the component's addMouseMotionListener method. (MouseMotionAdapter objects implement the MouseMotionListener interface.) Each such listener object gets a MouseEvent containing the mouse motion event.

When a mouse button is clicked, events are generated and sent to the registered MouseListeners. The state of modal keys can be retrieved using InputEvent.getModifiers and InputEvent.getModifiersEx. The button mask returned by InputEvent.getModifiers reflects only the button that changed state, not the current state of all buttons. (Note: Due to overlap in the values of ALT_MASK/BUTTON2_MASK and META_MASK/BUTTON3_MASK, this is not always true for mouse events involving modifier keys). To get the state of all buttons and modifier keys, use InputEvent.getModifiersEx. The button which has changed state is returned by getButton

For example, if the first mouse button is pressed, events are sent in the following order:


   id              modifiers    button
   MOUSE_PRESSED:  BUTTON1_MASK BUTTON1
   MOUSE_RELEASED: BUTTON1_MASK BUTTON1
   MOUSE_CLICKED:  BUTTON1_MASK BUTTON1
When multiple mouse buttons are pressed, each press, release, and click results in a separate event.

For example, if the user presses button 1 followed by button 2, and then releases them in the same order, the following sequence of events is generated:


   id              modifiers    button
   MOUSE_PRESSED:  BUTTON1_MASK BUTTON1
   MOUSE_PRESSED:  BUTTON2_MASK BUTTON2
   MOUSE_RELEASED: BUTTON1_MASK BUTTON1
   MOUSE_CLICKED:  BUTTON1_MASK BUTTON1
   MOUSE_RELEASED: BUTTON2_MASK BUTTON2
   MOUSE_CLICKED:  BUTTON2_MASK BUTTON2
If button 2 is released first, the MOUSE_RELEASED/MOUSE_CLICKED pair for BUTTON2_MASK arrives first, followed by the pair for BUTTON1_MASK.

Some extra mouse buttons are added to extend the standard set of buttons represented by the following constants:BUTTON1, BUTTON2, and BUTTON3. Extra buttons have no assigned BUTTONx constants as well as their button masks have no assigned BUTTONx_DOWN_MASK constants. Nevertheless, ordinal numbers starting from 4 may be used as button numbers (button ids). Values obtained by the getMaskForButton(button) method may be used as button masks.

MOUSE_DRAGGED events are delivered to the Component in which the mouse button was pressed until the mouse button is released (regardless of whether the mouse position is within the bounds of the Component). Due to platform-dependent Drag&Drop implementations, MOUSE_DRAGGED events may not be delivered during a native Drag&Drop operation. In a multi-screen environment mouse drag events are delivered to the Component even if the mouse position is outside the bounds of the GraphicsConfiguration associated with that Component. However, the reported position for mouse drag events in this case may differ from the actual mouse position:

  • In a multi-screen environment without a virtual device:
    The reported coordinates for mouse drag events are clipped to fit within the bounds of the GraphicsConfiguration associated with the Component.
  • In a multi-screen environment with a virtual device:
    The reported coordinates for mouse drag events are clipped to fit within the bounds of the virtual device associated with the Component.

An unspecified behavior will be caused if the id parameter of any particular MouseEvent instance is not in the range from MOUSE_FIRST to MOUSE_LAST-1 (MOUSE_WHEEL is not acceptable).

Author:Carl Quinn
See Also:
Since:1.1
/** * An event which indicates that a mouse action occurred in a component. * A mouse action is considered to occur in a particular component if and only * if the mouse cursor is over the unobscured part of the component's bounds * when the action happens. * For lightweight components, such as Swing's components, mouse events * are only dispatched to the component if the mouse event type has been * enabled on the component. A mouse event type is enabled by adding the * appropriate mouse-based {@code EventListener} to the component * ({@link MouseListener} or {@link MouseMotionListener}), or by invoking * {@link Component#enableEvents(long)} with the appropriate mask parameter * ({@code AWTEvent.MOUSE_EVENT_MASK} or {@code AWTEvent.MOUSE_MOTION_EVENT_MASK}). * If the mouse event type has not been enabled on the component, the * corresponding mouse events are dispatched to the first ancestor that * has enabled the mouse event type. *<p> * For example, if a {@code MouseListener} has been added to a component, or * {@code enableEvents(AWTEvent.MOUSE_EVENT_MASK)} has been invoked, then all * the events defined by {@code MouseListener} are dispatched to the component. * On the other hand, if a {@code MouseMotionListener} has not been added and * {@code enableEvents} has not been invoked with * {@code AWTEvent.MOUSE_MOTION_EVENT_MASK}, then mouse motion events are not * dispatched to the component. Instead the mouse motion events are * dispatched to the first ancestors that has enabled mouse motion * events. * <P> * This low-level event is generated by a component object for: * <ul> * <li>Mouse Events * <ul> * <li>a mouse button is pressed * <li>a mouse button is released * <li>a mouse button is clicked (pressed and released) * <li>the mouse cursor enters the unobscured part of component's geometry * <li>the mouse cursor exits the unobscured part of component's geometry * </ul> * <li> Mouse Motion Events * <ul> * <li>the mouse is moved * <li>the mouse is dragged * </ul> * </ul> * <P> * A {@code MouseEvent} object is passed to every * {@code MouseListener} * or {@code MouseAdapter} object which is registered to receive * the "interesting" mouse events using the component's * {@code addMouseListener} method. * ({@code MouseAdapter} objects implement the * {@code MouseListener} interface.) Each such listener object * gets a {@code MouseEvent} containing the mouse event. * <P> * A {@code MouseEvent} object is also passed to every * {@code MouseMotionListener} or * {@code MouseMotionAdapter} object which is registered to receive * mouse motion events using the component's * {@code addMouseMotionListener} * method. ({@code MouseMotionAdapter} objects implement the * {@code MouseMotionListener} interface.) Each such listener object * gets a {@code MouseEvent} containing the mouse motion event. * <P> * When a mouse button is clicked, events are generated and sent to the * registered {@code MouseListener}s. * The state of modal keys can be retrieved using {@link InputEvent#getModifiers} * and {@link InputEvent#getModifiersEx}. * The button mask returned by {@link InputEvent#getModifiers} reflects * only the button that changed state, not the current state of all buttons. * (Note: Due to overlap in the values of ALT_MASK/BUTTON2_MASK and * META_MASK/BUTTON3_MASK, this is not always true for mouse events involving * modifier keys). * To get the state of all buttons and modifier keys, use * {@link InputEvent#getModifiersEx}. * The button which has changed state is returned by {@link MouseEvent#getButton} * <P> * For example, if the first mouse button is pressed, events are sent in the * following order: * <pre><b> * id modifiers button</b>{@code * MOUSE_PRESSED: BUTTON1_MASK BUTTON1 * MOUSE_RELEASED: BUTTON1_MASK BUTTON1 * MOUSE_CLICKED: BUTTON1_MASK BUTTON1 * }</pre> * When multiple mouse buttons are pressed, each press, release, and click * results in a separate event. * <P> * For example, if the user presses <b>button 1</b> followed by * <b>button 2</b>, and then releases them in the same order, * the following sequence of events is generated: * <pre><b> * id modifiers button</b>{@code * MOUSE_PRESSED: BUTTON1_MASK BUTTON1 * MOUSE_PRESSED: BUTTON2_MASK BUTTON2 * MOUSE_RELEASED: BUTTON1_MASK BUTTON1 * MOUSE_CLICKED: BUTTON1_MASK BUTTON1 * MOUSE_RELEASED: BUTTON2_MASK BUTTON2 * MOUSE_CLICKED: BUTTON2_MASK BUTTON2 * }</pre> * If <b>button 2</b> is released first, the * {@code MOUSE_RELEASED}/{@code MOUSE_CLICKED} pair * for {@code BUTTON2_MASK} arrives first, * followed by the pair for {@code BUTTON1_MASK}. * <p> * Some extra mouse buttons are added to extend the standard set of buttons * represented by the following constants:{@code BUTTON1}, {@code BUTTON2}, and {@code BUTTON3}. * Extra buttons have no assigned {@code BUTTONx} * constants as well as their button masks have no assigned {@code BUTTONx_DOWN_MASK} * constants. Nevertheless, ordinal numbers starting from 4 may be * used as button numbers (button ids). Values obtained by the * {@link InputEvent#getMaskForButton(int) getMaskForButton(button)} method may be used * as button masks. * <p> * {@code MOUSE_DRAGGED} events are delivered to the {@code Component} * in which the mouse button was pressed until the mouse button is released * (regardless of whether the mouse position is within the bounds of the * {@code Component}). Due to platform-dependent Drag&amp;Drop implementations, * {@code MOUSE_DRAGGED} events may not be delivered during a native * Drag&amp;Drop operation. * * In a multi-screen environment mouse drag events are delivered to the * {@code Component} even if the mouse position is outside the bounds of the * {@code GraphicsConfiguration} associated with that * {@code Component}. However, the reported position for mouse drag events * in this case may differ from the actual mouse position: * <ul> * <li>In a multi-screen environment without a virtual device: * <br> * The reported coordinates for mouse drag events are clipped to fit within the * bounds of the {@code GraphicsConfiguration} associated with * the {@code Component}. * <li>In a multi-screen environment with a virtual device: * <br> * The reported coordinates for mouse drag events are clipped to fit within the * bounds of the virtual device associated with the {@code Component}. * </ul> * <p> * An unspecified behavior will be caused if the {@code id} parameter * of any particular {@code MouseEvent} instance is not * in the range from {@code MOUSE_FIRST} to {@code MOUSE_LAST}-1 * ({@code MOUSE_WHEEL} is not acceptable). * * @author Carl Quinn * * @see MouseAdapter * @see MouseListener * @see MouseMotionAdapter * @see MouseMotionListener * @see MouseWheelListener * @see <a href="https://docs.oracle.com/javase/tutorial/uiswing/events/mouselistener.html">Tutorial: Writing a Mouse Listener</a> * @see <a href="https://docs.oracle.com/javase/tutorial/uiswing/events/mousemotionlistener.html">Tutorial: Writing a Mouse Motion Listener</a> * * @since 1.1 */
public class MouseEvent extends InputEvent {
The first number in the range of ids used for mouse events.
/** * The first number in the range of ids used for mouse events. */
public static final int MOUSE_FIRST = 500;
The last number in the range of ids used for mouse events.
/** * The last number in the range of ids used for mouse events. */
public static final int MOUSE_LAST = 507;
The "mouse clicked" event. This MouseEvent occurs when a mouse button is pressed and released.
/** * The "mouse clicked" event. This {@code MouseEvent} * occurs when a mouse button is pressed and released. */
public static final int MOUSE_CLICKED = MOUSE_FIRST;
The "mouse pressed" event. This MouseEvent occurs when a mouse button is pushed down.
/** * The "mouse pressed" event. This {@code MouseEvent} * occurs when a mouse button is pushed down. */
public static final int MOUSE_PRESSED = 1 + MOUSE_FIRST; //Event.MOUSE_DOWN
The "mouse released" event. This MouseEvent occurs when a mouse button is let up.
/** * The "mouse released" event. This {@code MouseEvent} * occurs when a mouse button is let up. */
public static final int MOUSE_RELEASED = 2 + MOUSE_FIRST; //Event.MOUSE_UP
The "mouse moved" event. This MouseEvent occurs when the mouse position changes.
/** * The "mouse moved" event. This {@code MouseEvent} * occurs when the mouse position changes. */
public static final int MOUSE_MOVED = 3 + MOUSE_FIRST; //Event.MOUSE_MOVE
The "mouse entered" event. This MouseEvent occurs when the mouse cursor enters the unobscured part of component's geometry.
/** * The "mouse entered" event. This {@code MouseEvent} * occurs when the mouse cursor enters the unobscured part of component's * geometry. */
public static final int MOUSE_ENTERED = 4 + MOUSE_FIRST; //Event.MOUSE_ENTER
The "mouse exited" event. This MouseEvent occurs when the mouse cursor exits the unobscured part of component's geometry.
/** * The "mouse exited" event. This {@code MouseEvent} * occurs when the mouse cursor exits the unobscured part of component's * geometry. */
public static final int MOUSE_EXITED = 5 + MOUSE_FIRST; //Event.MOUSE_EXIT
The "mouse dragged" event. This MouseEvent occurs when the mouse position changes while a mouse button is pressed.
/** * The "mouse dragged" event. This {@code MouseEvent} * occurs when the mouse position changes while a mouse button is pressed. */
public static final int MOUSE_DRAGGED = 6 + MOUSE_FIRST; //Event.MOUSE_DRAG
The "mouse wheel" event. This is the only MouseWheelEvent. It occurs when a mouse equipped with a wheel has its wheel rotated.
Since:1.4
/** * The "mouse wheel" event. This is the only {@code MouseWheelEvent}. * It occurs when a mouse equipped with a wheel has its wheel rotated. * @since 1.4 */
public static final int MOUSE_WHEEL = 7 + MOUSE_FIRST;
Indicates no mouse buttons; used by getButton.
Since:1.4
/** * Indicates no mouse buttons; used by {@link #getButton}. * @since 1.4 */
public static final int NOBUTTON = 0;
Indicates mouse button #1; used by getButton.
Since:1.4
/** * Indicates mouse button #1; used by {@link #getButton}. * @since 1.4 */
public static final int BUTTON1 = 1;
Indicates mouse button #2; used by getButton.
Since:1.4
/** * Indicates mouse button #2; used by {@link #getButton}. * @since 1.4 */
public static final int BUTTON2 = 2;
Indicates mouse button #3; used by getButton.
Since:1.4
/** * Indicates mouse button #3; used by {@link #getButton}. * @since 1.4 */
public static final int BUTTON3 = 3;
The mouse event's x coordinate. The x value is relative to the component that fired the event.
See Also:
@serial
/** * The mouse event's x coordinate. * The x value is relative to the component that fired the event. * * @serial * @see #getX() */
int x;
The mouse event's y coordinate. The y value is relative to the component that fired the event.
See Also:
@serial
/** * The mouse event's y coordinate. * The y value is relative to the component that fired the event. * * @serial * @see #getY() */
int y;
The mouse event's x absolute coordinate. In a virtual device multi-screen environment in which the desktop area could span multiple physical screen devices, this coordinate is relative to the virtual coordinate system. Otherwise, this coordinate is relative to the coordinate system associated with the Component's GraphicsConfiguration.
@serial
/** * The mouse event's x absolute coordinate. * In a virtual device multi-screen environment in which the * desktop area could span multiple physical screen devices, * this coordinate is relative to the virtual coordinate system. * Otherwise, this coordinate is relative to the coordinate system * associated with the Component's GraphicsConfiguration. * * @serial */
private int xAbs;
The mouse event's y absolute coordinate. In a virtual device multi-screen environment in which the desktop area could span multiple physical screen devices, this coordinate is relative to the virtual coordinate system. Otherwise, this coordinate is relative to the coordinate system associated with the Component's GraphicsConfiguration.
@serial
/** * The mouse event's y absolute coordinate. * In a virtual device multi-screen environment in which the * desktop area could span multiple physical screen devices, * this coordinate is relative to the virtual coordinate system. * Otherwise, this coordinate is relative to the coordinate system * associated with the Component's GraphicsConfiguration. * * @serial */
private int yAbs;
Indicates the number of quick consecutive clicks of a mouse button. clickCount will be valid for only three mouse events :
MOUSE_CLICKED, MOUSE_PRESSED and MOUSE_RELEASED. For the above, the clickCount will be at least 1. For all other events the count will be 0.
See Also:
@serial
/** * Indicates the number of quick consecutive clicks of * a mouse button. * clickCount will be valid for only three mouse events :<BR> * {@code MOUSE_CLICKED}, * {@code MOUSE_PRESSED} and * {@code MOUSE_RELEASED}. * For the above, the {@code clickCount} will be at least 1. * For all other events the count will be 0. * * @serial * @see #getClickCount() */
int clickCount;
Indicates whether the event is a result of a touch event.
/** * Indicates whether the event is a result of a touch event. */
private boolean causedByTouchEvent;
Indicates which, if any, of the mouse buttons has changed state. The valid values are ranged from 0 to the value returned by the MouseInfo.getNumberOfButtons() method. This range already includes constants NOBUTTON, BUTTON1, BUTTON2, and BUTTON3 if these buttons are present. So it is allowed to use these constants too. For example, for a mouse with two buttons this field may contain the following values:
  • 0 (NOBUTTON)
  • 1 (BUTTON1)
  • 2 (BUTTON2)
If a mouse has 5 buttons, this field may contain the following values:
  • 0 (NOBUTTON)
  • 1 (BUTTON1)
  • 2 (BUTTON2)
  • 3 (BUTTON3)
  • 4
  • 5
If support for extended mouse buttons is Toolkit.areExtraMouseButtonsEnabled() disabled by Java then the field may not contain the value larger than BUTTON3.
See Also:
@serial
/** * Indicates which, if any, of the mouse buttons has changed state. * * The valid values are ranged from 0 to the value returned by the * {@link java.awt.MouseInfo#getNumberOfButtons() MouseInfo.getNumberOfButtons()} method. * This range already includes constants {@code NOBUTTON}, {@code BUTTON1}, * {@code BUTTON2}, and {@code BUTTON3} * if these buttons are present. So it is allowed to use these constants too. * For example, for a mouse with two buttons this field may contain the following values: * <ul> * <li> 0 ({@code NOBUTTON}) * <li> 1 ({@code BUTTON1}) * <li> 2 ({@code BUTTON2}) * </ul> * If a mouse has 5 buttons, this field may contain the following values: * <ul> * <li> 0 ({@code NOBUTTON}) * <li> 1 ({@code BUTTON1}) * <li> 2 ({@code BUTTON2}) * <li> 3 ({@code BUTTON3}) * <li> 4 * <li> 5 * </ul> * If support for extended mouse buttons is {@link Toolkit#areExtraMouseButtonsEnabled()} disabled by Java * then the field may not contain the value larger than {@code BUTTON3}. * @serial * @see #getButton() * @see java.awt.Toolkit#areExtraMouseButtonsEnabled() */
int button;
A property used to indicate whether a Popup Menu should appear with a certain gestures. If popupTrigger = false, no popup menu should appear. If it is true then a popup menu should appear.
See Also:
@serial
/** * A property used to indicate whether a Popup Menu * should appear with a certain gestures. * If {@code popupTrigger} = {@code false}, * no popup menu should appear. If it is {@code true} * then a popup menu should appear. * * @serial * @see java.awt.PopupMenu * @see #isPopupTrigger() */
boolean popupTrigger = false; /* * JDK 1.1 serialVersionUID */ private static final long serialVersionUID = -991214153494842848L;
A number of buttons available on the mouse at the Toolkit machinery startup.
/** * A number of buttons available on the mouse at the {@code Toolkit} machinery startup. */
private static int cachedNumberOfButtons; static { /* ensure that the necessary native libraries are loaded */ NativeLibLoader.loadLibraries(); if (!GraphicsEnvironment.isHeadless()) { initIDs(); } final Toolkit tk = Toolkit.getDefaultToolkit(); if (tk instanceof SunToolkit) { cachedNumberOfButtons = ((SunToolkit)tk).getNumberOfButtons(); } else { //It's expected that some toolkits (Headless, //whatever besides SunToolkit) could also operate. cachedNumberOfButtons = 3; } AWTAccessor.setMouseEventAccessor( new AWTAccessor.MouseEventAccessor() { public boolean isCausedByTouchEvent(MouseEvent ev) { return ev.causedByTouchEvent; } public void setCausedByTouchEvent(MouseEvent ev, boolean causedByTouchEvent) { ev.causedByTouchEvent = causedByTouchEvent; } }); }
Initialize JNI field and method IDs for fields that may be accessed from C.
/** * Initialize JNI field and method IDs for fields that may be * accessed from C. */
private static native void initIDs();
Returns the absolute x, y position of the event. In a virtual device multi-screen environment in which the desktop area could span multiple physical screen devices, these coordinates are relative to the virtual coordinate system. Otherwise, these coordinates are relative to the coordinate system associated with the Component's GraphicsConfiguration.
See Also:
Returns:a Point object containing the absolute x and y coordinates.
Since:1.6
/** * Returns the absolute x, y position of the event. * In a virtual device multi-screen environment in which the * desktop area could span multiple physical screen devices, * these coordinates are relative to the virtual coordinate system. * Otherwise, these coordinates are relative to the coordinate system * associated with the Component's GraphicsConfiguration. * * @return a {@code Point} object containing the absolute x * and y coordinates. * * @see java.awt.GraphicsConfiguration * @since 1.6 */
public Point getLocationOnScreen(){ return new Point(xAbs, yAbs); }
Returns the absolute horizontal x position of the event. In a virtual device multi-screen environment in which the desktop area could span multiple physical screen devices, this coordinate is relative to the virtual coordinate system. Otherwise, this coordinate is relative to the coordinate system associated with the Component's GraphicsConfiguration.
See Also:
Returns:x an integer indicating absolute horizontal position.
Since:1.6
/** * Returns the absolute horizontal x position of the event. * In a virtual device multi-screen environment in which the * desktop area could span multiple physical screen devices, * this coordinate is relative to the virtual coordinate system. * Otherwise, this coordinate is relative to the coordinate system * associated with the Component's GraphicsConfiguration. * * @return x an integer indicating absolute horizontal position. * * @see java.awt.GraphicsConfiguration * @since 1.6 */
public int getXOnScreen() { return xAbs; }
Returns the absolute vertical y position of the event. In a virtual device multi-screen environment in which the desktop area could span multiple physical screen devices, this coordinate is relative to the virtual coordinate system. Otherwise, this coordinate is relative to the coordinate system associated with the Component's GraphicsConfiguration.
See Also:
Returns:y an integer indicating absolute vertical position.
Since:1.6
/** * Returns the absolute vertical y position of the event. * In a virtual device multi-screen environment in which the * desktop area could span multiple physical screen devices, * this coordinate is relative to the virtual coordinate system. * Otherwise, this coordinate is relative to the coordinate system * associated with the Component's GraphicsConfiguration. * * @return y an integer indicating absolute vertical position. * * @see java.awt.GraphicsConfiguration * @since 1.6 */
public int getYOnScreen() { return yAbs; }
Constructs a MouseEvent object with the specified source component, type, time, modifiers, coordinates, click count, popupTrigger flag, and button number.

Creating an invalid event (such as by using more than one of the old _MASKs, or modifier/button values which don't match) results in unspecified behavior. An invocation of the form MouseEvent(source, id, when, modifiers, x, y, clickCount, popupTrigger, button) behaves in exactly the same way as the invocation MouseEvent(source, id, when, modifiers, x, y, xAbs, yAbs, clickCount, popupTrigger, button) where xAbs and yAbs defines as source's location on screen plus relative coordinates x and y. xAbs and yAbs are set to zero if the source is not showing. This method throws an IllegalArgumentException if source is null.

Params:
  • source – The Component that originated the event
  • id – An integer indicating the type of event. For information on allowable values, see the class description for MouseEvent
  • when – A long integer that gives the time the event occurred. Passing negative or zero value is not recommended
  • modifiers – a modifier mask describing the modifier keys and mouse buttons (for example, shift, ctrl, alt, and meta) that are down during the event. Only extended modifiers are allowed to be used as a value for this parameter (see the InputEvent.getModifiersEx class for the description of extended modifiers). Passing negative parameter is not recommended. Zero value means that no modifiers were passed
  • x – The horizontal x coordinate for the mouse location. It is allowed to pass negative values
  • y – The vertical y coordinate for the mouse location. It is allowed to pass negative values
  • clickCount – The number of mouse clicks associated with event. Passing negative value is not recommended
  • popupTrigger – A boolean that equals true if this event is a trigger for a popup menu
  • button – An integer that indicates, which of the mouse buttons has changed its state. The following rules are applied to this parameter:
    • If support for the extended mouse buttons is disabled by Java then it is allowed to create MouseEvent objects only with the standard buttons: NOBUTTON, BUTTON1, BUTTON2, and BUTTON3.
    • If support for the extended mouse buttons is enabled by Java then it is allowed to create MouseEvent objects with the standard buttons. In case the support for extended mouse buttons is enabled by Java, then in addition to the standard buttons, MouseEvent objects can be created using buttons from the range starting from 4 to MouseInfo.getNumberOfButtons() if the mouse has more than three buttons.
Throws:
See Also:
Since:1.4
/** * Constructs a {@code MouseEvent} object with the * specified source component, * type, time, modifiers, coordinates, click count, popupTrigger flag, * and button number. * <p> * Creating an invalid event (such * as by using more than one of the old _MASKs, or modifier/button * values which don't match) results in unspecified behavior. * An invocation of the form * {@code MouseEvent(source, id, when, modifiers, x, y, clickCount, popupTrigger, button)} * behaves in exactly the same way as the invocation * {@link #MouseEvent(Component, int, long, int, int, int, * int, int, int, boolean, int) MouseEvent(source, id, when, modifiers, * x, y, xAbs, yAbs, clickCount, popupTrigger, button)} * where xAbs and yAbs defines as source's location on screen plus * relative coordinates x and y. * xAbs and yAbs are set to zero if the source is not showing. * This method throws an * {@code IllegalArgumentException} if {@code source} * is {@code null}. * * @param source The {@code Component} that originated the event * @param id An integer indicating the type of event. * For information on allowable values, see * the class description for {@link MouseEvent} * @param when A long integer that gives the time the event occurred. * Passing negative or zero value * is not recommended * @param modifiers a modifier mask describing the modifier keys and mouse * buttons (for example, shift, ctrl, alt, and meta) that * are down during the event. * Only extended modifiers are allowed to be used as a * value for this parameter (see the {@link InputEvent#getModifiersEx} * class for the description of extended modifiers). * Passing negative parameter * is not recommended. * Zero value means that no modifiers were passed * @param x The horizontal x coordinate for the mouse location. * It is allowed to pass negative values * @param y The vertical y coordinate for the mouse location. * It is allowed to pass negative values * @param clickCount The number of mouse clicks associated with event. * Passing negative value * is not recommended * @param popupTrigger A boolean that equals {@code true} if this event * is a trigger for a popup menu * @param button An integer that indicates, which of the mouse buttons has * changed its state. * The following rules are applied to this parameter: * <ul> * <li>If support for the extended mouse buttons is * {@link Toolkit#areExtraMouseButtonsEnabled() disabled} by Java * then it is allowed to create {@code MouseEvent} objects only with the standard buttons: * {@code NOBUTTON}, {@code BUTTON1}, {@code BUTTON2}, and * {@code BUTTON3}. * <li> If support for the extended mouse buttons is * {@link Toolkit#areExtraMouseButtonsEnabled() enabled} by Java * then it is allowed to create {@code MouseEvent} objects with * the standard buttons. * In case the support for extended mouse buttons is * {@link Toolkit#areExtraMouseButtonsEnabled() enabled} by Java, then * in addition to the standard buttons, {@code MouseEvent} objects can be created * using buttons from the range starting from 4 to * {@link java.awt.MouseInfo#getNumberOfButtons() MouseInfo.getNumberOfButtons()} * if the mouse has more than three buttons. * </ul> * @throws IllegalArgumentException if {@code button} is less than zero * @throws IllegalArgumentException if {@code source} is null * @throws IllegalArgumentException if {@code button} is greater than BUTTON3 * and the support for extended mouse buttons is * {@link Toolkit#areExtraMouseButtonsEnabled() disabled} by Java * @throws IllegalArgumentException if {@code button} is greater than the * {@link java.awt.MouseInfo#getNumberOfButtons() current number of buttons} * and the support for extended mouse buttons is * {@link Toolkit#areExtraMouseButtonsEnabled() enabled} * by Java * @throws IllegalArgumentException if an invalid {@code button} * value is passed in * @throws IllegalArgumentException if {@code source} is null * @see #getSource() * @see #getID() * @see #getWhen() * @see #getModifiers() * @see #getX() * @see #getY() * @see #getClickCount() * @see #isPopupTrigger() * @see #getButton() * @since 1.4 */
public MouseEvent(Component source, int id, long when, int modifiers, int x, int y, int clickCount, boolean popupTrigger, int button) { this(source, id, when, modifiers, x, y, 0, 0, clickCount, popupTrigger, button); Point eventLocationOnScreen = new Point(0, 0); try { eventLocationOnScreen = source.getLocationOnScreen(); this.xAbs = eventLocationOnScreen.x + x; this.yAbs = eventLocationOnScreen.y + y; } catch (IllegalComponentStateException e){ this.xAbs = 0; this.yAbs = 0; } }
Constructs a MouseEvent object with the specified source component, type, modifiers, coordinates, click count, and popupTrigger flag. An invocation of the form MouseEvent(source, id, when, modifiers, x, y, clickCount, popupTrigger) behaves in exactly the same way as the invocation MouseEvent(source, id, when, modifiers, x, y, xAbs, yAbs, clickCount, popupTrigger, MouseEvent.NOBUTTON) where xAbs and yAbs defines as source's location on screen plus relative coordinates x and y. xAbs and yAbs are set to zero if the source is not showing. This method throws an IllegalArgumentException if source is null.
Params:
  • source – The Component that originated the event
  • id – An integer indicating the type of event. For information on allowable values, see the class description for MouseEvent
  • when – A long integer that gives the time the event occurred. Passing negative or zero value is not recommended
  • modifiers – a modifier mask describing the modifier keys and mouse buttons (for example, shift, ctrl, alt, and meta) that are down during the event. Only extended modifiers are allowed to be used as a value for this parameter (see the InputEvent.getModifiersEx class for the description of extended modifiers). Passing negative parameter is not recommended. Zero value means that no modifiers were passed
  • x – The horizontal x coordinate for the mouse location. It is allowed to pass negative values
  • y – The vertical y coordinate for the mouse location. It is allowed to pass negative values
  • clickCount – The number of mouse clicks associated with event. Passing negative value is not recommended
  • popupTrigger – A boolean that equals true if this event is a trigger for a popup menu
Throws:
See Also:
/** * Constructs a {@code MouseEvent} object with the * specified source component, * type, modifiers, coordinates, click count, and popupTrigger flag. * An invocation of the form * {@code MouseEvent(source, id, when, modifiers, x, y, clickCount, popupTrigger)} * behaves in exactly the same way as the invocation * {@link #MouseEvent(Component, int, long, int, int, int, * int, int, int, boolean, int) MouseEvent(source, id, when, modifiers, * x, y, xAbs, yAbs, clickCount, popupTrigger, MouseEvent.NOBUTTON)} * where xAbs and yAbs defines as source's location on screen plus * relative coordinates x and y. * xAbs and yAbs are set to zero if the source is not showing. * This method throws an {@code IllegalArgumentException} * if {@code source} is {@code null}. * * @param source The {@code Component} that originated the event * @param id An integer indicating the type of event. * For information on allowable values, see * the class description for {@link MouseEvent} * @param when A long integer that gives the time the event occurred. * Passing negative or zero value * is not recommended * @param modifiers a modifier mask describing the modifier keys and mouse * buttons (for example, shift, ctrl, alt, and meta) that * are down during the event. * Only extended modifiers are allowed to be used as a * value for this parameter (see the {@link InputEvent#getModifiersEx} * class for the description of extended modifiers). * Passing negative parameter * is not recommended. * Zero value means that no modifiers were passed * @param x The horizontal x coordinate for the mouse location. * It is allowed to pass negative values * @param y The vertical y coordinate for the mouse location. * It is allowed to pass negative values * @param clickCount The number of mouse clicks associated with event. * Passing negative value * is not recommended * @param popupTrigger A boolean that equals {@code true} if this event * is a trigger for a popup menu * @throws IllegalArgumentException if {@code source} is null * @see #getSource() * @see #getID() * @see #getWhen() * @see #getModifiers() * @see #getX() * @see #getY() * @see #getClickCount() * @see #isPopupTrigger() */
public MouseEvent(Component source, int id, long when, int modifiers, int x, int y, int clickCount, boolean popupTrigger) { this(source, id, when, modifiers, x, y, clickCount, popupTrigger, NOBUTTON); } /* if the button is an extra button and it is released or clicked then in Xsystem its state is not modified. Exclude this button number from ExtModifiers mask.*/ private transient boolean shouldExcludeButtonFromExtModifiers = false;
{@inheritDoc}
/** * {@inheritDoc} */
public int getModifiersEx() { int tmpModifiers = modifiers; if (shouldExcludeButtonFromExtModifiers) { tmpModifiers &= ~(InputEvent.getMaskForButton(getButton())); } return tmpModifiers & ~JDK_1_3_MODIFIERS; }
Constructs a MouseEvent object with the specified source component, type, time, modifiers, coordinates, absolute coordinates, click count, popupTrigger flag, and button number.

Creating an invalid event (such as by using more than one of the old _MASKs, or modifier/button values which don't match) results in unspecified behavior. Even if inconsistent values for relative and absolute coordinates are passed to the constructor, the mouse event instance is still created and no exception is thrown. This method throws an IllegalArgumentException if source is null.

Params:
  • source – The Component that originated the event
  • id – An integer indicating the type of event. For information on allowable values, see the class description for MouseEvent
  • when – A long integer that gives the time the event occurred. Passing negative or zero value is not recommended
  • modifiers – a modifier mask describing the modifier keys and mouse buttons (for example, shift, ctrl, alt, and meta) that are down during the event. Only extended modifiers are allowed to be used as a value for this parameter (see the InputEvent.getModifiersEx class for the description of extended modifiers). Passing negative parameter is not recommended. Zero value means that no modifiers were passed
  • x – The horizontal x coordinate for the mouse location. It is allowed to pass negative values
  • y – The vertical y coordinate for the mouse location. It is allowed to pass negative values
  • xAbs – The absolute horizontal x coordinate for the mouse location It is allowed to pass negative values
  • yAbs – The absolute vertical y coordinate for the mouse location It is allowed to pass negative values
  • clickCount – The number of mouse clicks associated with event. Passing negative value is not recommended
  • popupTrigger – A boolean that equals true if this event is a trigger for a popup menu
  • button – An integer that indicates, which of the mouse buttons has changed its state. The following rules are applied to this parameter:
    • If support for the extended mouse buttons is disabled by Java then it is allowed to create MouseEvent objects only with the standard buttons: NOBUTTON, BUTTON1, BUTTON2, and BUTTON3.
    • If support for the extended mouse buttons is enabled by Java then it is allowed to create MouseEvent objects with the standard buttons. In case the support for extended mouse buttons is enabled by Java, then in addition to the standard buttons, MouseEvent objects can be created using buttons from the range starting from 4 to MouseInfo.getNumberOfButtons() if the mouse has more than three buttons.
Throws:
See Also:
Since:1.6
/** * Constructs a {@code MouseEvent} object with the * specified source component, * type, time, modifiers, coordinates, absolute coordinates, click count, popupTrigger flag, * and button number. * <p> * Creating an invalid event (such * as by using more than one of the old _MASKs, or modifier/button * values which don't match) results in unspecified behavior. * Even if inconsistent values for relative and absolute coordinates are * passed to the constructor, the mouse event instance is still * created and no exception is thrown. * This method throws an * {@code IllegalArgumentException} if {@code source} * is {@code null}. * * @param source The {@code Component} that originated the event * @param id An integer indicating the type of event. * For information on allowable values, see * the class description for {@link MouseEvent} * @param when A long integer that gives the time the event occurred. * Passing negative or zero value * is not recommended * @param modifiers a modifier mask describing the modifier keys and mouse * buttons (for example, shift, ctrl, alt, and meta) that * are down during the event. * Only extended modifiers are allowed to be used as a * value for this parameter (see the {@link InputEvent#getModifiersEx} * class for the description of extended modifiers). * Passing negative parameter * is not recommended. * Zero value means that no modifiers were passed * @param x The horizontal x coordinate for the mouse location. * It is allowed to pass negative values * @param y The vertical y coordinate for the mouse location. * It is allowed to pass negative values * @param xAbs The absolute horizontal x coordinate for the mouse location * It is allowed to pass negative values * @param yAbs The absolute vertical y coordinate for the mouse location * It is allowed to pass negative values * @param clickCount The number of mouse clicks associated with event. * Passing negative value * is not recommended * @param popupTrigger A boolean that equals {@code true} if this event * is a trigger for a popup menu * @param button An integer that indicates, which of the mouse buttons has * changed its state. * The following rules are applied to this parameter: * <ul> * <li>If support for the extended mouse buttons is * {@link Toolkit#areExtraMouseButtonsEnabled() disabled} by Java * then it is allowed to create {@code MouseEvent} objects only with the standard buttons: * {@code NOBUTTON}, {@code BUTTON1}, {@code BUTTON2}, and * {@code BUTTON3}. * <li> If support for the extended mouse buttons is * {@link Toolkit#areExtraMouseButtonsEnabled() enabled} by Java * then it is allowed to create {@code MouseEvent} objects with * the standard buttons. * In case the support for extended mouse buttons is * {@link Toolkit#areExtraMouseButtonsEnabled() enabled} by Java, then * in addition to the standard buttons, {@code MouseEvent} objects can be created * using buttons from the range starting from 4 to * {@link java.awt.MouseInfo#getNumberOfButtons() MouseInfo.getNumberOfButtons()} * if the mouse has more than three buttons. * </ul> * @throws IllegalArgumentException if {@code button} is less than zero * @throws IllegalArgumentException if {@code source} is null * @throws IllegalArgumentException if {@code button} is greater than BUTTON3 * and the support for extended mouse buttons is * {@link Toolkit#areExtraMouseButtonsEnabled() disabled} by Java * @throws IllegalArgumentException if {@code button} is greater than the * {@link java.awt.MouseInfo#getNumberOfButtons() * current number of buttons} and the support * for extended mouse buttons is {@link Toolkit#areExtraMouseButtonsEnabled() enabled} * by Java * @throws IllegalArgumentException if an invalid {@code button} * value is passed in * @throws IllegalArgumentException if {@code source} is null * @see #getSource() * @see #getID() * @see #getWhen() * @see #getModifiers() * @see #getX() * @see #getY() * @see #getXOnScreen() * @see #getYOnScreen() * @see #getClickCount() * @see #isPopupTrigger() * @see #getButton() * @see Toolkit#areExtraMouseButtonsEnabled() * @see java.awt.MouseInfo#getNumberOfButtons() * @see InputEvent#getMaskForButton(int) * @since 1.6 */
@SuppressWarnings("deprecation") public MouseEvent(Component source, int id, long when, int modifiers, int x, int y, int xAbs, int yAbs, int clickCount, boolean popupTrigger, int button) { super(source, id, when, modifiers); this.x = x; this.y = y; this.xAbs = xAbs; this.yAbs = yAbs; this.clickCount = clickCount; this.popupTrigger = popupTrigger; if (button < NOBUTTON){ throw new IllegalArgumentException("Invalid button value :" + button); } if (button > BUTTON3) { if (!Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled()){ throw new IllegalArgumentException("Extra mouse events are disabled " + button); } else { if (button > cachedNumberOfButtons) { throw new IllegalArgumentException("Nonexistent button " + button); } } // XToolkit: extra buttons are not reporting about their state correctly. // Being pressed they report the state=0 both on the press and on the release. // For 1-3 buttons the state value equals zero on press and non-zero on release. // Other modifiers like Shift, ALT etc seem report well with extra buttons. // The problem reveals as follows: one button is pressed and then another button is pressed and released. // So, the getModifiersEx() would not be zero due to a first button and we will skip this modifier. // This may have to be moved into the peer code instead if possible. if (getModifiersEx() != 0) { //There is at least one more button in a pressed state. if (id == MouseEvent.MOUSE_RELEASED || id == MouseEvent.MOUSE_CLICKED){ shouldExcludeButtonFromExtModifiers = true; } } } this.button = button; if ((getModifiers() != 0) && (getModifiersEx() == 0)) { setNewModifiers(); } else if ((getModifiers() == 0) && (getModifiersEx() != 0 || button != NOBUTTON) && (button <= BUTTON3)) { setOldModifiers(); } }
Returns the horizontal x position of the event relative to the source component.
Returns:x an integer indicating horizontal position relative to the component
/** * Returns the horizontal x position of the event relative to the * source component. * * @return x an integer indicating horizontal position relative to * the component */
public int getX() { return x; }
Returns the vertical y position of the event relative to the source component.
Returns:y an integer indicating vertical position relative to the component
/** * Returns the vertical y position of the event relative to the * source component. * * @return y an integer indicating vertical position relative to * the component */
public int getY() { return y; }
Returns the x,y position of the event relative to the source component.
Returns:a Point object containing the x and y coordinates relative to the source component
/** * Returns the x,y position of the event relative to the source component. * * @return a {@code Point} object containing the x and y coordinates * relative to the source component * */
public Point getPoint() { int x; int y; synchronized (this) { x = this.x; y = this.y; } return new Point(x, y); }
Translates the event's coordinates to a new position by adding specified x (horizontal) and y (vertical) offsets.
Params:
  • x – the horizontal x value to add to the current x coordinate position
  • y – the vertical y value to add to the current y coordinate position
/** * Translates the event's coordinates to a new position * by adding specified {@code x} (horizontal) and {@code y} * (vertical) offsets. * * @param x the horizontal x value to add to the current x * coordinate position * @param y the vertical y value to add to the current y coordinate position */
public synchronized void translatePoint(int x, int y) { this.x += x; this.y += y; }
Returns the number of mouse clicks associated with this event.
Returns:integer value for the number of clicks
/** * Returns the number of mouse clicks associated with this event. * * @return integer value for the number of clicks */
public int getClickCount() { return clickCount; }
Returns which, if any, of the mouse buttons has changed state. The returned value is ranged from 0 to the MouseInfo.getNumberOfButtons() value. The returned value includes at least the following constants:
  • NOBUTTON
  • BUTTON1
  • BUTTON2
  • BUTTON3
It is allowed to use those constants to compare with the returned button number in the application. For example,
if (anEvent.getButton() == MouseEvent.BUTTON1) {
In particular, for a mouse with one, two, or three buttons this method may return the following values:
  • 0 (NOBUTTON)
  • 1 (BUTTON1)
  • 2 (BUTTON2)
  • 3 (BUTTON3)
Button numbers greater than BUTTON3 have no constant identifier. So if a mouse with five buttons is installed, this method may return the following values:
  • 0 (NOBUTTON)
  • 1 (BUTTON1)
  • 2 (BUTTON2)
  • 3 (BUTTON3)
  • 4
  • 5

Note: If support for extended mouse buttons is disabled by Java then the AWT event subsystem does not produce mouse events for the extended mouse buttons. So it is not expected that this method returns anything except NOBUTTON, BUTTON1, BUTTON2, BUTTON3.

See Also:
Returns:one of the values from 0 to MouseInfo.getNumberOfButtons() if support for the extended mouse buttons is enabled by Java. That range includes NOBUTTON, BUTTON1, BUTTON2, BUTTON3;
NOBUTTON, BUTTON1, BUTTON2 or BUTTON3 if support for the extended mouse buttons is disabled by Java
Since:1.4
/** * Returns which, if any, of the mouse buttons has changed state. * The returned value is ranged * from 0 to the {@link java.awt.MouseInfo#getNumberOfButtons() MouseInfo.getNumberOfButtons()} * value. * The returned value includes at least the following constants: * <ul> * <li> {@code NOBUTTON} * <li> {@code BUTTON1} * <li> {@code BUTTON2} * <li> {@code BUTTON3} * </ul> * It is allowed to use those constants to compare with the returned button number in the application. * For example, * <pre> * if (anEvent.getButton() == MouseEvent.BUTTON1) { * </pre> * In particular, for a mouse with one, two, or three buttons this method may return the following values: * <ul> * <li> 0 ({@code NOBUTTON}) * <li> 1 ({@code BUTTON1}) * <li> 2 ({@code BUTTON2}) * <li> 3 ({@code BUTTON3}) * </ul> * Button numbers greater than {@code BUTTON3} have no constant identifier. * So if a mouse with five buttons is * installed, this method may return the following values: * <ul> * <li> 0 ({@code NOBUTTON}) * <li> 1 ({@code BUTTON1}) * <li> 2 ({@code BUTTON2}) * <li> 3 ({@code BUTTON3}) * <li> 4 * <li> 5 * </ul> * <p> * Note: If support for extended mouse buttons is {@link Toolkit#areExtraMouseButtonsEnabled() disabled} by Java * then the AWT event subsystem does not produce mouse events for the extended mouse * buttons. So it is not expected that this method returns anything except {@code NOBUTTON}, {@code BUTTON1}, * {@code BUTTON2}, {@code BUTTON3}. * * @return one of the values from 0 to {@link java.awt.MouseInfo#getNumberOfButtons() MouseInfo.getNumberOfButtons()} * if support for the extended mouse buttons is {@link Toolkit#areExtraMouseButtonsEnabled() enabled} by Java. * That range includes {@code NOBUTTON}, {@code BUTTON1}, {@code BUTTON2}, {@code BUTTON3}; * <br> * {@code NOBUTTON}, {@code BUTTON1}, {@code BUTTON2} or {@code BUTTON3} * if support for the extended mouse buttons is {@link Toolkit#areExtraMouseButtonsEnabled() disabled} by Java * @since 1.4 * @see Toolkit#areExtraMouseButtonsEnabled() * @see java.awt.MouseInfo#getNumberOfButtons() * @see #MouseEvent(Component, int, long, int, int, int, int, int, int, boolean, int) * @see InputEvent#getMaskForButton(int) */
public int getButton() { return button; }
Returns whether or not this mouse event is the popup menu trigger event for the platform.

Note: Popup menus are triggered differently on different systems. Therefore, isPopupTrigger should be checked in both mousePressed and mouseReleased for proper cross-platform functionality.

Returns:boolean, true if this event is the popup menu trigger for this platform
/** * Returns whether or not this mouse event is the popup menu * trigger event for the platform. * <p><b>Note</b>: Popup menus are triggered differently * on different systems. Therefore, {@code isPopupTrigger} * should be checked in both {@code mousePressed} * and {@code mouseReleased} * for proper cross-platform functionality. * * @return boolean, true if this event is the popup menu trigger * for this platform */
public boolean isPopupTrigger() { return popupTrigger; }
Returns a String instance describing the modifier keys and mouse buttons that were down during the event, such as "Shift", or "Ctrl+Shift". These strings can be localized by changing the awt.properties file.

Note that the InputEvent.ALT_MASK and InputEvent.BUTTON2_MASK have equal values, so the "Alt" string is returned for both modifiers. Likewise, the InputEvent.META_MASK and InputEvent.BUTTON3_MASK have equal values, so the "Meta" string is returned for both modifiers.

Note that passing negative parameter is incorrect, and will cause the returning an unspecified string. Zero parameter means that no modifiers were passed and will cause the returning an empty string.

Params:
  • modifiers – A modifier mask describing the modifier keys and mouse buttons that were down during the event
See Also:
Returns:string string text description of the combination of modifier keys and mouse buttons that were down during the event
Since:1.4
/** * Returns a {@code String} instance describing the modifier keys and * mouse buttons that were down during the event, such as "Shift", * or "Ctrl+Shift". These strings can be localized by changing * the {@code awt.properties} file. * <p> * Note that the {@code InputEvent.ALT_MASK} and * {@code InputEvent.BUTTON2_MASK} have equal values, * so the "Alt" string is returned for both modifiers. Likewise, * the {@code InputEvent.META_MASK} and * {@code InputEvent.BUTTON3_MASK} have equal values, * so the "Meta" string is returned for both modifiers. * <p> * Note that passing negative parameter is incorrect, * and will cause the returning an unspecified string. * Zero parameter means that no modifiers were passed and will * cause the returning an empty string. * * @param modifiers A modifier mask describing the modifier keys and * mouse buttons that were down during the event * @return string string text description of the combination of modifier * keys and mouse buttons that were down during the event * @see InputEvent#getModifiersExText(int) * @since 1.4 */
@SuppressWarnings("deprecation") public static String getMouseModifiersText(int modifiers) { StringBuilder buf = new StringBuilder(); if ((modifiers & InputEvent.ALT_MASK) != 0) { buf.append(Toolkit.getProperty("AWT.alt", "Alt")); buf.append("+"); } if ((modifiers & InputEvent.META_MASK) != 0) { buf.append(Toolkit.getProperty("AWT.meta", "Meta")); buf.append("+"); } if ((modifiers & InputEvent.CTRL_MASK) != 0) { buf.append(Toolkit.getProperty("AWT.control", "Ctrl")); buf.append("+"); } if ((modifiers & InputEvent.SHIFT_MASK) != 0) { buf.append(Toolkit.getProperty("AWT.shift", "Shift")); buf.append("+"); } if ((modifiers & InputEvent.ALT_GRAPH_MASK) != 0) { buf.append(Toolkit.getProperty("AWT.altGraph", "Alt Graph")); buf.append("+"); } if ((modifiers & InputEvent.BUTTON1_MASK) != 0) { buf.append(Toolkit.getProperty("AWT.button1", "Button1")); buf.append("+"); } if ((modifiers & InputEvent.BUTTON2_MASK) != 0) { buf.append(Toolkit.getProperty("AWT.button2", "Button2")); buf.append("+"); } if ((modifiers & InputEvent.BUTTON3_MASK) != 0) { buf.append(Toolkit.getProperty("AWT.button3", "Button3")); buf.append("+"); } int mask; // TODO: add a toolkit field that holds a number of button on the mouse. // As the method getMouseModifiersText() is static and obtain // an integer as a parameter then we may not restrict this with the number // of buttons installed on the mouse. // It's a temporary solution. We need to somehow hold the number of buttons somewhere else. for (int i = 1; i <= cachedNumberOfButtons; i++){ mask = InputEvent.getMaskForButton(i); if ((modifiers & mask) != 0 && buf.indexOf(Toolkit.getProperty("AWT.button"+i, "Button"+i)) == -1) //1,2,3 buttons may already be there; so don't duplicate it. { buf.append(Toolkit.getProperty("AWT.button"+i, "Button"+i)); buf.append("+"); } } if (buf.length() > 0) { buf.setLength(buf.length()-1); // remove trailing '+' } return buf.toString(); }
Returns a parameter string identifying this event. This method is useful for event-logging and for debugging.
Returns:a string identifying the event and its attributes
/** * Returns a parameter string identifying this event. * This method is useful for event-logging and for debugging. * * @return a string identifying the event and its attributes */
@SuppressWarnings("deprecation") public String paramString() { StringBuilder str = new StringBuilder(80); switch(id) { case MOUSE_PRESSED: str.append("MOUSE_PRESSED"); break; case MOUSE_RELEASED: str.append("MOUSE_RELEASED"); break; case MOUSE_CLICKED: str.append("MOUSE_CLICKED"); break; case MOUSE_ENTERED: str.append("MOUSE_ENTERED"); break; case MOUSE_EXITED: str.append("MOUSE_EXITED"); break; case MOUSE_MOVED: str.append("MOUSE_MOVED"); break; case MOUSE_DRAGGED: str.append("MOUSE_DRAGGED"); break; case MOUSE_WHEEL: str.append("MOUSE_WHEEL"); break; default: str.append("unknown type"); } // (x,y) coordinates str.append(",(").append(x).append(",").append(y).append(")"); str.append(",absolute(").append(xAbs).append(",").append(yAbs).append(")"); if (id != MOUSE_DRAGGED && id != MOUSE_MOVED){ str.append(",button=").append(getButton()); } if (getModifiers() != 0) { str.append(",modifiers=").append(getMouseModifiersText(modifiers)); } if (getModifiersEx() != 0) { //Using plain "modifiers" here does show an excluded extended buttons in the string event representation. //getModifiersEx() solves the problem. str.append(",extModifiers=").append(getModifiersExText(getModifiersEx())); } str.append(",clickCount=").append(clickCount); return str.toString(); }
Sets new modifiers by the old ones. Also sets button.
/** * Sets new modifiers by the old ones. * Also sets button. */
@SuppressWarnings("deprecation") private void setNewModifiers() { if ((modifiers & BUTTON1_MASK) != 0) { modifiers |= BUTTON1_DOWN_MASK; } if ((modifiers & BUTTON2_MASK) != 0) { modifiers |= BUTTON2_DOWN_MASK; } if ((modifiers & BUTTON3_MASK) != 0) { modifiers |= BUTTON3_DOWN_MASK; } if (id == MOUSE_PRESSED || id == MOUSE_RELEASED || id == MOUSE_CLICKED) { if ((modifiers & BUTTON1_MASK) != 0) { button = BUTTON1; modifiers &= ~BUTTON2_MASK & ~BUTTON3_MASK; if (id != MOUSE_PRESSED) { modifiers &= ~BUTTON1_DOWN_MASK; } } else if ((modifiers & BUTTON2_MASK) != 0) { button = BUTTON2; modifiers &= ~BUTTON1_MASK & ~BUTTON3_MASK; if (id != MOUSE_PRESSED) { modifiers &= ~BUTTON2_DOWN_MASK; } } else if ((modifiers & BUTTON3_MASK) != 0) { button = BUTTON3; modifiers &= ~BUTTON1_MASK & ~BUTTON2_MASK; if (id != MOUSE_PRESSED) { modifiers &= ~BUTTON3_DOWN_MASK; } } } if ((modifiers & InputEvent.ALT_MASK) != 0) { modifiers |= InputEvent.ALT_DOWN_MASK; } if ((modifiers & InputEvent.META_MASK) != 0) { modifiers |= InputEvent.META_DOWN_MASK; } if ((modifiers & InputEvent.SHIFT_MASK) != 0) { modifiers |= InputEvent.SHIFT_DOWN_MASK; } if ((modifiers & InputEvent.CTRL_MASK) != 0) { modifiers |= InputEvent.CTRL_DOWN_MASK; } if ((modifiers & InputEvent.ALT_GRAPH_MASK) != 0) { modifiers |= InputEvent.ALT_GRAPH_DOWN_MASK; } }
Sets old modifiers by the new ones.
/** * Sets old modifiers by the new ones. */
@SuppressWarnings("deprecation") private void setOldModifiers() { if (id == MOUSE_PRESSED || id == MOUSE_RELEASED || id == MOUSE_CLICKED) { switch(button) { case BUTTON1: modifiers |= BUTTON1_MASK; break; case BUTTON2: modifiers |= BUTTON2_MASK; break; case BUTTON3: modifiers |= BUTTON3_MASK; break; } } else { if ((modifiers & BUTTON1_DOWN_MASK) != 0) { modifiers |= BUTTON1_MASK; } if ((modifiers & BUTTON2_DOWN_MASK) != 0) { modifiers |= BUTTON2_MASK; } if ((modifiers & BUTTON3_DOWN_MASK) != 0) { modifiers |= BUTTON3_MASK; } } if ((modifiers & ALT_DOWN_MASK) != 0) { modifiers |= ALT_MASK; } if ((modifiers & META_DOWN_MASK) != 0) { modifiers |= META_MASK; } if ((modifiers & SHIFT_DOWN_MASK) != 0) { modifiers |= SHIFT_MASK; } if ((modifiers & CTRL_DOWN_MASK) != 0) { modifiers |= CTRL_MASK; } if ((modifiers & ALT_GRAPH_DOWN_MASK) != 0) { modifiers |= ALT_GRAPH_MASK; } }
Sets new modifiers by the old ones.
@serial
/** * Sets new modifiers by the old ones. * @serial */
@SuppressWarnings("deprecation") private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { s.defaultReadObject(); if (getModifiers() != 0 && getModifiersEx() == 0) { setNewModifiers(); } } }