Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本引入的改进,并可能使用已不再可用的技术。
有关Java SE 9及后续版本中更新的语言功能的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或不推荐使用的选项的信息,请参阅JDK发行说明。
鼠标事件通知用户使用鼠标(或类似的输入设备)与组件进行交互。当光标进入或离开组件的屏幕区域,以及用户按下或释放鼠标按钮时,鼠标事件会发生。
跟踪光标的移动比跟踪其他鼠标事件需要更多的系统开销。这就是为什么鼠标移动事件被分为鼠标移动监听器类型(参见如何编写鼠标移动监听器)。
要跟踪鼠标滚轮事件,您可以注册鼠标滚轮监听器。有关更多信息,请参阅如何编写鼠标滚轮监听器。
如果应用程序需要检测鼠标事件和鼠标移动事件,则使用MouseInputAdapter
类。该类实现了MouseInputListener
,这是一个方便的接口,实现了MouseListener
和MouseMotionListener
接口。但是,MouseInputListener
接口不实现MouseWheelListener
接口。
或者,使用对应的AWTMouseAdapter
类,它实现了MouseListener
、MouseMotionListener
和MouseWheelListener
接口。
下面的示例展示了一个鼠标监听器。窗口顶部是一个空白区域(由一个名为BlankArea
的类实现)。鼠标监听器同时监听BlankArea
和其容器MouseEventDemo
的事件。每次发生鼠标事件时,在空白区域下方显示一个描述性消息。通过将光标移动到空白区域上方,并偶尔按下鼠标按钮,您可以触发鼠标事件。
您可以在MouseEventDemo.java
和BlankArea.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); } }
方法 | 目的 |
---|---|
mouseClicked(MouseEvent) | 在用户点击监听的组件之后调用。 |
mouseEntered(MouseEvent) | 在光标进入监听的组件边界之后调用。 |
mouseExited(MouseEvent) | 在光标退出监听的组件边界之后调用。 |
mousePressed(MouseEvent) | 在光标悬停在监听的组件上并按下鼠标按钮之后调用。 |
mouseReleased(MouseEvent) | 在光标在鼠标按下监听的组件之后释放鼠标按钮之后调用。 |
MouseAdapter类(AWT适配器类)是抽象的。所有它的方法都为空的。所以开发者可以定义应用程序特定的事件方法。你也可以使用MouseInputAdapter类,该类包含了MouseListener和MouseMotionListener的所有方法。
方法 | 目的 |
---|---|
int getClickCount() | 返回用户进行的快速连续点击次数(包括本次事件)。例如,双击返回2。 |
int getX() int getY() Point getPoint() |
返回事件发生时相对于触发事件的组件的(x,y)位置。 |
int getXOnScreen() int getYOnScreen() int getLocationOnScreen() |
返回事件的绝对(x,y)位置。这些坐标相对于多屏环境的虚拟坐标系统。否则,这些坐标相对于与组件的图形配置关联的坐标系统。 |
int getButton() | 返回改变状态的鼠标按钮,如果有的话。返回以下常量之一:NOBUTTON 、BUTTON1 、BUTTON2 或BUTTON3 。 |
boolean isPopupTrigger() | 如果鼠标事件应该导致弹出菜单出现,则返回true 。由于弹出触发器与平台相关,如果程序使用弹出菜单,应该对所有鼠标按下和鼠标释放事件调用isPopupTrigger ,这些事件由可以出现弹出菜单的组件触发。有关弹出菜单的更多信息,请参见弹出菜单。 |
String getMouseModifiersText(int) | 返回描述事件期间活动的修饰键和鼠标按钮的String ,例如"Shift"或"Ctrl+Shift"。这些字符串可以使用awt.properties文件进行本地化。 |
MouseEvent
类从 InputEvent 继承了许多有用的方法,并且从 ComponentEvent
和 AWTEvent
类继承了一些方便的方法。
java.awt.AWTEvent
中)MouseEvent.MOUSE_PRESSED
MouseEvent.MOUSE_RELEASED
MouseEvent.MOUSE_CLICKED
Component getComponent()
ComponentEvent
中)getSource
int getWhen()boolean isAltDown()
InputEvent
getModifiers
ALT_MASK
BUTTON1_MASK
BUTTON2_MASK
BUTTON3_MASK
CTRL_MASK
META_MASK
SHIFT_MASK
(mouseEvent.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK
SHIFT_DOWN_MASK
CTRL_DOWN_MASK
META_DOWN_MASK
ALT_DOWN_MASK
BUTTON1_DOWN_MASK
BUTTON2_DOWN_MASK
BUTTON3_DOWN_MASK
ALT_GRAPH_DOWN_MASK
if (event.getModifiersEx() & (BUTTON1_DOWN_MASK | BUTTON2_DOWN_MASK | BUTTON3_DOWN_MASK) == BUTTON1_DOWN_MASK) { ... }
MouseInfo类提供了在应用程序运行时获取鼠标指针位置信息的方法。
方法 | 目的 |
---|---|
getPointerInfo() | 返回表示鼠标指针当前位置的PointerInfo实例。 |
getNumberOfButtons() | 返回鼠标上的按钮数,如果系统不支持鼠标则返回-1。 |
以下表格列出了使用鼠标监听器的示例。
示例 | 描述位置 | 注释 |
---|---|---|
MouseEventDemo |
本节 | 报告发生在空白面板中的所有鼠标事件,以演示鼠标事件触发的情况。 |
GlassPaneDemo |
如何使用Root Panes | 使用MouseInputAdapter 的子类监听根窗格的玻璃窗格上的鼠标事件和鼠标移动事件。重新分发事件给底层组件。 |
TableSortDemo |
如何使用表格 | 监听表头上的鼠标事件。对所选列中的数据进行排序。 |
PopupMenuDemo |
如何使用菜单 | 响应鼠标点击显示弹出菜单。 |
TrackFocusDemo |
如何使用焦点子系统 | 自定义组件Picture 实现了鼠标监听器,当用户点击组件时请求焦点。 |