这些Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言变更,了解Java SE 9及其后续版本中更新的语言特性的摘要。
请参阅JDK发行说明,了解所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息。
鼠标移动事件在用户使用鼠标(或类似的输入设备)移动屏幕光标时通知。有关监听其他类型的鼠标事件(如点击)的信息,请参见如何编写鼠标监听器。有关监听鼠标滚轮事件的信息,请参见如何编写鼠标滚轮监听器。
如果应用程序需要检测鼠标事件和鼠标移动事件,可以使用实现MouseInputAdapter
类的MouseInputListener
接口,该接口是一个方便的接口,同时实现了MouseListener
和MouseMotionListener
接口。
或者,可以使用相应的AWT类MouseAdapter
,该类实现了MouseMotionListener
接口,创建MouseMotionEvent
并覆盖特定事件的方法。
以下演示代码包含一个鼠标移动监听器。这个演示与如何编写鼠标监听器部分中描述的演示完全相同,只是将MouseMotionListener
接口替换为MouseListener
接口。此外,MouseMotionEventDemo
实现了mouseDragged
和mouseMoved
方法,而不是鼠标监听器方法,并显示坐标而不是点击次数。
MouseMotionEventDemo
。或者,要自行编译和运行示例,请参阅示例索引。你可以在MouseMotionEventDemo.java
和BlankArea.java
中找到演示的代码。以下来自MouseMotionEventDemo
的代码段实现了鼠标移动事件的处理:
public class MouseMotionEventDemo extends JPanel implements MouseMotionListener { //...在初始化代码中: //在blankArea和面板上注册鼠标事件。 blankArea.addMouseMotionListener(this); addMouseMotionListener(this); ... } public void mouseMoved(MouseEvent e) { saySomething("鼠标移动", e); } public void mouseDragged(MouseEvent e) { saySomething("鼠标拖动", e); } void saySomething(String eventDescription, MouseEvent e) { textArea.append(eventDescription + " (" + e.getX() + "," + e.getY() + ")" + " detected on " + e.getComponent().getClass().getName() + newline); } }
SelectionDemo示例绘制一个矩形来说明用户的当前拖动。为了绘制矩形,应用程序必须实现三种类型的鼠标事件的事件处理程序:鼠标按下、鼠标拖动和鼠标释放。为了接收所有这些事件的通知,处理程序必须同时实现MouseListener
和MouseMotionListener
接口,并且注册为鼠标监听器和鼠标移动监听器。为了避免定义空方法,处理程序没有直接实现这两个监听器接口。相反,它扩展了MouseInputAdapter
,如下面的代码片段所示。
...//初始化代码: MyListener myListener = new MyListener(); addMouseListener(myListener); addMouseMotionListener(myListener); ... private class MyListener extends MouseInputAdapter { public void mousePressed(MouseEvent e) { int x = e.getX(); int y = e.getY(); currentRect = new Rectangle(x, y, 0, 0); updateDrawableRect(getWidth(), getHeight()); repaint(); } public void mouseDragged(MouseEvent e) { updateSize(e); } public void mouseReleased(MouseEvent e) { updateSize(e); } void updateSize(MouseEvent e) { int x = e.getX(); int y = e.getY(); currentRect.setSize(x - currentRect.x, y - currentRect.y); updateDrawableRect(getWidth(), getHeight()); Rectangle totalRepaint = rectToDraw.union(previouseRectDrawn); repaint(totalRepaint.x, totalRepaint.y, totalRepaint.width, totalRepaint.height); } }
对应的适配器类是MouseMotionAdapter
和MouseAdapter
。
方法 | 用途 |
---|---|
mouseDragged(MouseEvent) | 响应用户按下鼠标按钮并移动鼠标时调用。即使光标不再位于触发最近的鼠标按下事件的组件上,该事件仍由触发该事件的组件触发。 |
mouseMoved(MouseEvent) | 响应用户在未按下鼠标按钮的情况下移动鼠标时调用。该事件由当前位于光标下的组件触发。 |
每个鼠标移动事件方法都有一个单一参数,并且该参数不被称为MouseMotionEvent
!而是每个鼠标移动事件方法使用一个MouseEvent
参数。有关使用MouseEvent
对象的信息,请参见MouseEvent API。
以下表格列出了使用鼠标移动监听器的示例。
示例 | 描述位置 | 注释 |
---|---|---|
MouseMotionEventDemo |
本节 | 报告发生在空白面板内的所有鼠标移动事件,以演示触发鼠标移动事件的情况。 |
LayeredPaneDemo 和LayeredPaneDemo2 |
如何使用分层面板 | 根据鼠标移动事件,在分层面板内移动Duke的图像。 |
SelectionDemo |
允许用户拖动一个矩形框来选择图像的一部分。使用MouseInputAdapter 的子类监听鼠标事件和鼠标移动事件。 |
|
GlassPaneDemo |
如何使用根面板 | 使用MouseInputAdapter 的子类监听根面板的玻璃窗格上的鼠标事件和鼠标移动事件。重新分发事件给底层组件。 |
ScrollDemo |
如何使用滚动面板 | 标签的子类ScrollablePicture使用鼠标移动监听器,即使用户将光标拖到窗口外,也可以滚动图片。 |