文档

Java™ 教程
隐藏目录
如何编写鼠标滚轮监听器
路径: 使用Swing创建GUI
课程: 编写事件监听器
章节: 实现常见事件的监听器

如何编写鼠标滚轮监听器

鼠标滚轮事件会在鼠标滚轮旋转时通知。有关监听其他鼠标事件(例如点击)的信息,请参见如何编写鼠标监听器。有关监听鼠标拖动事件的信息,请参见如何编写鼠标移动监听器。并非所有的鼠标都有滚轮,在这种情况下,不会生成鼠标滚轮事件。无法通过编程方式检测鼠标是否配备了鼠标滚轮。

或者,使用相应的MouseAdapter AWT类来创建MouseWheelEvent并重写特定事件的方法。

通常不需要实现鼠标滚轮监听器,因为鼠标滚轮主要用于滚动。滚动窗格会自动注册鼠标滚轮监听器,以适当地响应鼠标滚轮。

但是,如果要创建一个自定义组件,用于在滚动窗格中使用,可能需要自定义其滚动行为,特别是可能需要设置单位和块增量。例如,对于文本区域,滚动一个单位意味着滚动一行文本。块增量通常滚动一个整个“页面”或视口的大小。有关更多信息,请参见实现一个懂滚动的客户端如何使用滚动窗格页面中。

要生成鼠标滚轮事件,光标必须位于注册监听鼠标滚轮事件的组件上方。滚动的类型(WHEEL_UNIT_SCROLLWHEEL_BLOCK_SCROLL)取决于平台。鼠标滚轮滚动的量也取决于平台。通过鼠标控制面板可以设置滚动的类型和量。

以下示例演示了鼠标滚轮事件。


请尝试: 
  1. 点击“启动”按钮以使用Java™ Web Start运行MouseWheelEventDemo(下载JDK 7或更高版本)。或者,要自己编译和运行示例,请参考示例索引启动MouseWheelEventDemo应用程序
  2. 将光标移到文本区域上。
  3. 向外旋转鼠标滚轮。你会看到一个或多个向的鼠标滚轮事件。
  4. 向相反的方向旋转鼠标滚轮。你会看到向的鼠标滚轮事件。
  5. 尝试在系统的鼠标控制面板中更改鼠标滚轮的滚动行为,以查看输出如何变化。不需要重新启动演示以查看更改生效。

对于一个使用单位增量作为鼠标滚轮的系统,MouseWheelEventDemo的输出如下:

javax.swing.JTextArea: 鼠标滚轮向上滚动1个刻度
    滚动类型:WHEEL_UNIT_SCROLL
    滚动量:每个刻度3个单位增量
    需要滚动的单位:每个刻度-3个单位增量
    垂直单位增量:16个像素

通过getScrollAmount方法返回的滚动量表示将要滚动的单位数,并始终为正数。通过getUnitsToScroll方法返回的滚动单位,在向下滚动时为正数,在向上滚动时为负数。垂直单位的像素数是通过使用getUnitIncrement方法从垂直滚动条获得的。在上面的示例中,向上滚动鼠标滚轮一个刻度应该导致文本区向上滚动48个像素(3x16)。

对于一个使用块增量进行鼠标滚轮滚动的系统,对于相同的鼠标滚轮移动,输出可能如下所示:

javax.swing.JTextArea: 鼠标滚轮向上滚动1个刻度
    滚动类型:WHEEL_BLOCK_SCROLL
    垂直块增量:307个像素

垂直块增量是通过使用getBlockIncrement方法从垂直滚动条获得的。在这种情况下,向上滚动鼠标滚轮一个刻度意味着文本区应该向上滚动307个像素。

MouseWheelEventDemo.java文件中找到演示的代码。以下代码片段与鼠标滚轮事件处理相关:

public class MouseWheelEventDemo ... implements MouseWheelListener ... {
    public MouseWheelEventDemo() {
        //初始化操作:
        //在文本区域上注册鼠标滚轮事件监听器。
        textArea.addMouseWheelListener(this);
        ...
    }

    public void mouseWheelMoved(MouseWheelEvent e) {
       String message;
       int notches = e.getWheelRotation();
       if (notches < 0) {
           message = "鼠标滚轮向上滚动 "
                        + -notches + " 个刻度" + newline;
       } else {
           message = "鼠标滚轮向下滚动 "
                        + notches + " 个刻度" + newline;
       }
       if (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) {
           message += "    滚动类型:WHEEL_UNIT_SCROLL" + newline;
           message += "    滚动量:" + e.getScrollAmount()
                   + " 个单位增量每个刻度" + newline;
           message += "    需要滚动的单位:" + e.getUnitsToScroll()
                   + " 个单位增量" + newline;
           message += "    垂直单位增量:"
               + scrollPane.getVerticalScrollBar().getUnitIncrement(1)
               + " 个像素" + newline;
       } else { //scroll type == MouseWheelEvent.WHEEL_BLOCK_SCROLL
           message += "    滚动类型:WHEEL_BLOCK_SCROLL" + newline;
           message += "    垂直块增量:"
               + scrollPane.getVerticalScrollBar().getBlockIncrement(1)
               + " 个像素" + newline;
       }
       saySomething(message, e);
    }
    ...
}

鼠标滚轮监听器API

鼠标滚轮监听器接口

虽然MouseWheelListener只有一个方法,但它有相应的适配器类——MouseAdapter。这使得应用程序只需要为组件管理鼠标指针的所有类型的事件创建一个适配器类实例。

方法 目的
mouseWheelMoved(MouseWheelEvent) 当鼠标滚轮被旋转时调用。

鼠标滚轮事件类

方法 目的
int getScrollType() 返回要使用的滚动类型。可能的值是WHEEL_BLOCK_SCROLLWHEEL_UNIT_SCROLL,由本地平台确定。
int getWheelRotation() 返回鼠标滚轮旋转的刻度数。如果鼠标滚轮向用户(向下)旋转,则值为正数。如果鼠标滚轮远离用户(向上)旋转,则值为负数。
int getScrollAmount() 返回每个刻度应该滚动的单位数。这始终是一个正数,仅在滚动类型为MouseWheelEvent.WHEEL_UNIT_SCROLL时有效。
int getUnitsToScroll() 返回当前事件要滚动的正数或负数单位。只有当滚动类型为MouseWheelEvent.WHEEL_UNIT_SCROLL时才有效。

使用鼠标滚轮监听器的示例

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

示例 描述位置 说明
MouseWheelEventDemo 本节 报告所有在文本区域内发生的鼠标滚轮事件,以演示触发鼠标滚轮事件的情况。

上一页: 如何编写鼠标移动监听器
下一页: 如何编写属性更改监听器