文档

Java™ 教程
隐藏目录
如何编写一个鼠标移动监听器
路径:使用Swing创建GUI
教程:编写事件监听器
部分:实现常见事件的监听器

如何编写鼠标移动监听器

鼠标移动事件在用户使用鼠标(或类似的输入设备)移动屏幕光标时通知。有关监听其他类型的鼠标事件(如点击)的信息,请参见如何编写鼠标监听器。有关监听鼠标滚轮事件的信息,请参见如何编写鼠标滚轮监听器

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

或者,可以使用相应的AWT类MouseAdapter,该类实现了MouseMotionListener接口,创建MouseMotionEvent并覆盖特定事件的方法。

以下演示代码包含一个鼠标移动监听器。这个演示与如何编写鼠标监听器部分中描述的演示完全相同,只是将MouseMotionListener接口替换为MouseListener接口。此外,MouseMotionEventDemo实现了mouseDraggedmouseMoved方法,而不是鼠标监听器方法,并显示坐标而不是点击次数。

MouseMotionEventDemo screen shot

请尝试以下操作: 
  1. 点击“启动”按钮,使用Java™ Web Start下载 JDK 7 或更高版本)运行MouseMotionEventDemo。或者,要自行编译和运行示例,请参阅示例索引启动 MouseMotionEventDemo 应用程序
  2. 将光标移动到窗口顶部的黄色矩形中。
    您将看到一个或多个鼠标移动事件。
  3. 按住鼠标按钮,然后将鼠标移动到黄色矩形外部。
    您将看到鼠标拖动事件。

你可以在MouseMotionEventDemo.javaBlankArea.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示例绘制一个矩形来说明用户的当前拖动。为了绘制矩形,应用程序必须实现三种类型的鼠标事件的事件处理程序:鼠标按下、鼠标拖动和鼠标释放。为了接收所有这些事件的通知,处理程序必须同时实现MouseListenerMouseMotionListener接口,并且注册为鼠标监听器和鼠标移动监听器。为了避免定义空方法,处理程序没有直接实现这两个监听器接口。相反,它扩展了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);
    }
}

鼠标移动监听器API

鼠标移动监听器接口

对应的适配器类是MouseMotionAdapterMouseAdapter

方法 用途
mouseDragged(MouseEvent) 响应用户按下鼠标按钮并移动鼠标时调用。即使光标不再位于触发最近的鼠标按下事件的组件上,该事件仍由触发该事件的组件触发。
mouseMoved(MouseEvent) 响应用户在未按下鼠标按钮的情况下移动鼠标时调用。该事件由当前位于光标下的组件触发。

每个鼠标移动事件方法都有一个单一参数,并且该参数被称为MouseMotionEvent!而是每个鼠标移动事件方法使用一个MouseEvent参数。有关使用MouseEvent对象的信息,请参见MouseEvent API

使用鼠标移动监听器的示例

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

示例 描述位置 注释
MouseMotionEventDemo 本节 报告发生在空白面板内的所有鼠标移动事件,以演示触发鼠标移动事件的情况。
LayeredPaneDemo
LayeredPaneDemo2
如何使用分层面板 根据鼠标移动事件,在分层面板内移动Duke的图像。
SelectionDemo   允许用户拖动一个矩形框来选择图像的一部分。使用MouseInputAdapter的子类监听鼠标事件和鼠标移动事件。
GlassPaneDemo 如何使用根面板 使用MouseInputAdapter的子类监听根面板的玻璃窗格上的鼠标事件和鼠标移动事件。重新分发事件给底层组件。
ScrollDemo 如何使用滚动面板 标签的子类ScrollablePicture使用鼠标移动监听器,即使用户将光标拖到窗口外,也可以滚动图片。

上一页:如何编写鼠标监听器
下一页:如何编写鼠标滚轮监听器