文档

Java™ 教程
隐藏目录
如何编写Mouse监听器
指南: 使用Swing创建GUI
教程: 编写事件监听器
部分: 实现常用事件的监听器

如何编写鼠标监听器

鼠标事件通知用户使用鼠标(或类似的输入设备)与组件进行交互。当光标进入或离开组件的屏幕区域,以及用户按下或释放鼠标按钮时,鼠标事件会发生。

跟踪光标的移动比跟踪其他鼠标事件需要更多的系统开销。这就是为什么鼠标移动事件被分为鼠标移动监听器类型(参见如何编写鼠标移动监听器)。

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

如果应用程序需要检测鼠标事件和鼠标移动事件,则使用MouseInputAdapter类。该类实现了MouseInputListener,这是一个方便的接口,实现了MouseListenerMouseMotionListener接口。但是,MouseInputListener接口不实现MouseWheelListener接口。

或者,使用对应的AWTMouseAdapter类,它实现了MouseListenerMouseMotionListenerMouseWheelListener接口。

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

MouseEventDemo 屏幕截图

试一试: 
  1. 点击启动按钮,使用Java™ Web Start运行MouseEventDemo(下载JDK 7或更高版本)。或者,要自己编译和运行示例,请参考示例索引启动MouseEventDemo应用程序
  2. 将光标移到窗口顶部的黄色矩形内。
    您将看到一个或多个鼠标进入事件。
  3. 按住左键不移动鼠标。
    您将看到一个鼠标按下事件。您可能会看到一些额外的鼠标事件,如鼠标离开然后鼠标进入。
  4. 释放鼠标按钮。
    您将看到一个鼠标释放事件。如果您没有移动鼠标,将紧接着看到一个鼠标点击事件。
  5. 再次按住鼠标按钮,然后将鼠标拖动到窗口外。释放鼠标按钮。
    您将看到一个鼠标按下事件,接着是一个鼠标离开事件,然后是一个鼠标释放事件。不会收到有关鼠标移动的通知。要获取鼠标移动事件,您需要实现鼠标移动监听器。

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

public class MouseEventDemo ... implements MouseListener {
        //初始化发生的位置:
        //在blankArea和面板上注册鼠标事件。
        blankArea.addMouseListener(this);
        addMouseListener(this);
    ...

    public void mousePressed(MouseEvent e) {
       saySomething("鼠标按下;点击次数:"
                    + e.getClickCount(), e);
    }

    public void mouseReleased(MouseEvent e) {
       saySomething("鼠标释放;点击次数:"
                    + e.getClickCount(), e);
    }

    public void mouseEntered(MouseEvent e) {
       saySomething("鼠标进入", e);
    }

    public void mouseExited(MouseEvent e) {
       saySomething("鼠标退出", e);
    }

    public void mouseClicked(MouseEvent e) {
       saySomething("鼠标点击(点击次数:"
                    + e.getClickCount() + ")", e);
    }

    void saySomething(String eventDescription, MouseEvent e) {
        textArea.append(eventDescription + " 检测到 "
                        + e.getComponent().getClass().getName()
                        + "。" + newline);
    }
}

鼠标监听器API

MouseListener接口

方法 目的
mouseClicked(MouseEvent) 在用户点击监听的组件之后调用。
mouseEntered(MouseEvent) 在光标进入监听的组件边界之后调用。
mouseExited(MouseEvent) 在光标退出监听的组件边界之后调用。
mousePressed(MouseEvent) 在光标悬停在监听的组件上并按下鼠标按钮之后调用。
mouseReleased(MouseEvent) 在光标在鼠标按下监听的组件之后释放鼠标按钮之后调用。

MouseAdapter类(AWT适配器类)是抽象的。所有它的方法都为空的。所以开发者可以定义应用程序特定的事件方法。你也可以使用MouseInputAdapter类,该类包含了MouseListener和MouseMotionListener的所有方法。

MouseEvent类

方法 目的
int getClickCount() 返回用户进行的快速连续点击次数(包括本次事件)。例如,双击返回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 类继承了一些方便的方法。

int getID()
java.awt.AWTEvent 中)MouseEvent.MOUSE_PRESSEDMouseEvent.MOUSE_RELEASEDMouseEvent.MOUSE_CLICKEDComponent getComponent()
ComponentEvent 中)getSourceint getWhen()boolean isAltDown()
boolean isControlDown()
boolean isMetaDown()
boolean isShiftDown()
int getModifiers()InputEventgetModifiersALT_MASKBUTTON1_MASKBUTTON2_MASKBUTTON3_MASKCTRL_MASKMETA_MASKSHIFT_MASK
(mouseEvent.getModifiers() & InputEvent.BUTTON3_MASK)
== InputEvent.BUTTON3_MASK
int getModifiersEx()SHIFT_DOWN_MASKCTRL_DOWN_MASKMETA_DOWN_MASKALT_DOWN_MASKBUTTON1_DOWN_MASKBUTTON2_DOWN_MASKBUTTON3_DOWN_MASKALT_GRAPH_DOWN_MASK
if (event.getModifiersEx() & (BUTTON1_DOWN_MASK |
                              BUTTON2_DOWN_MASK |
                              BUTTON3_DOWN_MASK)
                               == BUTTON1_DOWN_MASK) {
    ...
}
int getModifiersExText(int)

MouseInfo类

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

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

使用鼠标监听器的示例

以下表格列出了使用鼠标监听器的示例。

示例 描述位置 注释
MouseEventDemo 本节 报告发生在空白面板中的所有鼠标事件,以演示鼠标事件触发的情况。
GlassPaneDemo 如何使用Root Panes 使用MouseInputAdapter的子类监听根窗格的玻璃窗格上的鼠标事件和鼠标移动事件。重新分发事件给底层组件。
TableSortDemo 如何使用表格 监听表头上的鼠标事件。对所选列中的数据进行排序。
PopupMenuDemo 如何使用菜单 响应鼠标点击显示弹出菜单。
TrackFocusDemo 如何使用焦点子系统 自定义组件Picture实现了鼠标监听器,当用户点击组件时请求焦点。

上一页: 如何编写列表选择监听器
下一页: 如何编写鼠标移动监听器