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_PRESSEDMouseEvent.MOUSE_RELEASEDMouseEvent.MOUSE_CLICKEDComponent getComponent()
ComponentEvent 中)getSourceint getWhen()boolean isAltDown()
InputEventgetModifiersALT_MASKBUTTON1_MASKBUTTON2_MASKBUTTON3_MASKCTRL_MASKMETA_MASKSHIFT_MASK
(mouseEvent.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK
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) {
...
}
MouseInfo类提供了在应用程序运行时获取鼠标指针位置信息的方法。
| 方法 | 目的 |
|---|---|
| getPointerInfo() | 返回表示鼠标指针当前位置的PointerInfo实例。 |
| getNumberOfButtons() | 返回鼠标上的按钮数,如果系统不支持鼠标则返回-1。 |
以下表格列出了使用鼠标监听器的示例。
| 示例 | 描述位置 | 注释 |
|---|---|---|
MouseEventDemo |
本节 | 报告发生在空白面板中的所有鼠标事件,以演示鼠标事件触发的情况。 |
GlassPaneDemo |
如何使用Root Panes | 使用MouseInputAdapter的子类监听根窗格的玻璃窗格上的鼠标事件和鼠标移动事件。重新分发事件给底层组件。 |
TableSortDemo |
如何使用表格 | 监听表头上的鼠标事件。对所选列中的数据进行排序。 |
PopupMenuDemo |
如何使用菜单 | 响应鼠标点击显示弹出菜单。 |
TrackFocusDemo |
如何使用焦点子系统 | 自定义组件Picture实现了鼠标监听器,当用户点击组件时请求焦点。 |