如何编写鼠标侦听器

鼠标事件通知用户何时使用鼠标(或类似的 Importing 设备)与组件进行交互。当光标进入或退出组件的屏幕区域以及用户按下或释放鼠标键之一时,就会发生鼠标事件。

与跟踪其他鼠标事件相比,跟踪光标的运动涉及更多的系统开销。这就是为什么将鼠标移动事件分为“鼠标移动”侦听器类型(请参见如何编写鼠标运动侦听器)。

要跟踪鼠标滚轮事件,可以注册鼠标滚轮侦听器。有关更多信息,请参见如何编写鼠标滚轮监听器

如果应用程序需要同时检测鼠标事件和鼠标运动事件,请使用MouseInputAdapter类。此类实现MouseInputListener,这是实现MouseListenerMouseMotionListenerinterface的便捷interface。但是,MouseInputListenerinterface未实现MouseWheelListenerinterface。

或者,使用相应的 AWT MouseAdapter类,该类实现MouseListenerMouseMotionListenerMouseWheelListenerinterface。

以下示例显示了鼠标侦听器。窗口顶部是一个空白区域(由名为BlankArea的类实现)。鼠标侦听器在BlankArea及其容器(MouseEventDemo的实例)上侦听事件。每次发生鼠标事件时,空白区域下方都会显示一条描述性消息。通过将光标移动到空白区域的顶部并偶尔按下鼠标按钮,可以触发鼠标事件。

MouseEventDemo 屏幕截图

Try this:

  • 单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 MouseEventDemo。另外,要自己编译和运行示例,请查阅example index

  • 将光标移到窗口顶部的黄色矩形中。
    您将看到一个或多个鼠标 Importing 的事件。

  • 按住鼠标左键不移动鼠标。
    您将看到一个鼠标按下的事件。您可能会看到一些额外的鼠标事件,例如退出鼠标然后进入鼠标。

  • 释放鼠标按钮。
    您将看到一个鼠标释放事件。如果您不移动鼠标,将发生鼠标单击事件。

  • 再次按住鼠标按钮,然后拖动鼠标,使光标final移到窗口外。释放鼠标按钮。
    您将看到一个鼠标按下的事件,接着是一个鼠标退出的事件,接着是一个鼠标释放的事件。不会*通知您光标的运动。要获取鼠标移动事件,您需要实现mouse-motion listener.

您可以在MouseEventDemo.javaBlankArea.java中找到该演示的代码。这是演示的鼠标事件处理代码:

public class MouseEventDemo ... implements MouseListener {
        //where initialization occurs:
        //Register for mouse events on blankArea and the panel.
        blankArea.addMouseListener(this);
        addMouseListener(this);
    ...

    public void mousePressed(MouseEvent e) {
       saySomething("Mouse pressed; # of clicks: "
                    + e.getClickCount(), e);
    }

    public void mouseReleased(MouseEvent e) {
       saySomething("Mouse released; # of clicks: "
                    + e.getClickCount(), e);
    }

    public void mouseEntered(MouseEvent e) {
       saySomething("Mouse entered", e);
    }

    public void mouseExited(MouseEvent e) {
       saySomething("Mouse exited", e);
    }

    public void mouseClicked(MouseEvent e) {
       saySomething("Mouse clicked (# of clicks: "
                    + e.getClickCount() + ")", e);
    }

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

鼠标监听器 API

MouseListener interface

MethodPurpose
mouseClicked(MouseEvent)在用户单击监听的组件之后立即调用。
mouseEntered(MouseEvent)在光标进入侦听组件的边界之后立即调用。
mouseExited(MouseEvent)在光标退出侦听组件的边界之后立即调用。
mousePressed(MouseEvent)在光标位于已侦听组件上方时用户按下鼠标按钮后立即调用。
mouseReleased(MouseEvent)在鼠标在已侦听组件上按下后用户释放鼠标按钮后立即调用。

MouseAdapter类(AWT 适配器类)是抽象的。它所有的方法都有一个空的主体。因此,开发人员可以为特定于应用程序的事件定义方法。您还可以使用MouseInputAdapter类,该类具有MouseListenerMouseMotionListener中可用的所有方法。

MouseEvent 类

MethodPurpose
int getClickCount()返回用户连续快速单击(包括此事件)的次数。例如对于 Double 击返回 2.
int getX()

int getY()
Point getPoint()
相对于引发事件的组件,返回事件发生的(x,y)位置。
int getXOnScreen()
int getYOnScreen()
int getLocationOnScreen()
返回事件的绝对(x,y)位置。这些坐标相对于多屏幕环境的虚拟坐标系。否则,这些坐标是相对于与组件的图形配置关联的坐标系的。
int getButton()返回哪个鼠标按钮的状态已更改。返回以下常量之一:NOBUTTONBUTTON1BUTTON2BUTTON3
boolean isPopupTrigger()如果鼠标事件应导致出现弹出菜单,则返回true。由于弹出式触发器是与平台相关的,因此,如果您的程序使用弹出菜单,则应针对可在其上显示弹出式窗口的组件触发的所有鼠标按下和鼠标释放的事件调用isPopupTrigger。有关弹出菜单的更多信息,请参见弹出菜单
String getMouseModifiersText(int)返回一个String,描述事件期间处于活动状态的修饰键和鼠标按钮,例如“ Shift”或“ Ctrl Shift”。可以使用 awt.properties 文件对这些字符串 进行本地化。

InputEvent 类

MouseEvent类继承了InputEvent的许多有用方法,并继承了ComponentEventAWTEvent类的一些便捷方法。

MethodPurpose
int getID()

(* in java.awt.AWTEvent *)
返回事件类型,该事件类型定义了特定的操作。例如,MouseEvent id 反映每个鼠标事件的鼠标按钮状态。 MouseEvent ID 可以指定以下状态:MouseEvent.MOUSE_PRESSEDMouseEvent.MOUSE_RELEASEDMouseEvent.MOUSE_CLICKED
Component getComponent()
(* in ComponentEvent *)
返回引发事件的组件。您可以使用此方法代替getSource方法。
int getWhen()返回此事件发生的时间戳。时间戳越高,事件发生的时间越近。
boolean isAltDown()
boolean isControlDown()
boolean isMetaDown()
boolean isShiftDown()
返回触发事件时各个修改键的状态。
int getModifiers()返回触发事件时所有修饰键和鼠标按钮的状态。您可以使用此方法确定触发鼠标事件时按下(或释放)了哪个鼠标按钮。 InputEvent类定义了用于getModifiers方法的以下常量:ALT_MASKBUTTON1_MASKBUTTON2_MASKBUTTON3_MASKCTRL_MASKMETA_MASKSHIFT_MASK。例如,如果按下了右键,则以下表达式为 true:
(mouseEvent.getModifiers()和 InputEvent.BUTTON3_MASK)
== InputEvent.BUTTON3_MASK
int getModifiersEx()返回此事件的扩展修饰符掩码。扩展修饰符表示事件刚发生后鼠标按钮和所有 Pattern 键的状态,例如 ALT,CTRL,META。您可以使用以下 预定义的位掩码之一检查修改器的状态:SHIFT_DOWN_MASKCTRL_DOWN_MASKMETA_DOWN_MASKALT_DOWN_MASKBUTTON1_DOWN_MASKBUTTON2_DOWN_MASKBUTTON3_DOWN_MASKALT_GRAPH_DOWN_MASK。例如,要检查按钮 1 按下,但按钮 2 和 3 按下,您可以使用以下代码段:
如果(event.getModifiersEx()和(BUTTON1_DOWN_MASK

BUTTON2_DOWN_MASK

BUTTON3_DOWN_MASK)
== BUTTON1_DOWN_MASK)
int getModifiersExText(int)返回描述扩展的修饰键和鼠标按钮的字符串,例如“ Shift”,“ Button1”或“ Ctrl Shift”。可以通过更改 awt.properties 文件来本地化这些字符串。

MouseInfo 类

MouseInfo类提供在应用程序运行时随时获取有关鼠标指针位置信息的方法。

MethodPurpose
getPointerInfo()返回表示鼠标指针当前位置的PointerInfo实例。
getNumberOfButtons()返回鼠标或-1(如果系统不支持鼠标)上的按钮数。

使用鼠标侦听器的示例

下表列出了使用鼠标侦听器的示例。

ExampleWhere DescribedNotes
MouseEventDemoThis section报告在空白面板中发生的所有鼠标事件,以演示触发鼠标事件的情况。
GlassPaneDemo如何使用根窗格使用MouseInputAdapter的子类在根窗格的玻璃窗格上侦听鼠标事件和鼠标移动事件。将事件重新调度到基础组件。
TableSortDemo如何使用表格侦听表头上的鼠标事件。对所选列中的数据进行排序。
PopupMenuDemo如何使用菜单根据鼠标单击显示弹出菜单。
TrackFocusDemo如何使用 Focus 子系统定制组件Picture实现了一个鼠标侦听器,当用户单击该组件时会请求焦点。