如何编写鼠标轮侦听器

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

或者,使用实现MouseWheelListenerinterface的相应的MouseAdapter AWT 类创建MouseWheelEvent并覆盖特定事件的方法。

通常不需要实现鼠标滚轮监听器,因为鼠标滚轮主要用于滚动。滚动窗格会自动注册对鼠标滚轮做出适当反应的鼠标滚轮侦听器。

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

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

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

Try this:

  • 单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 MouseWheelEventDemo。另外,要自己编译和运行示例,请查阅example index

  • 将光标移到文本区域上。

  • 旋转鼠标滚轮远离您。您将在向上方向上看到一个或多个鼠标滚轮事件。

  • 沿相反方向旋转鼠标滚轮。您会在* down *方向上看到鼠标滚轮事件。

  • try在系统的鼠标控制面板上更改鼠标滚轮的滚动行为,以查看输出的变化。您无需重新启动演示即可看到更改生效。

对于使用鼠标滚轮单位增量的系统,MouseWheelEventDemo 的输出可能如下所示:

javax.swing.JTextArea: Mouse wheel moved UP 1 notch(es)
    Scroll type: WHEEL_UNIT_SCROLL
    Scroll amount: 3 unit increments per notch
    Units to scroll: -3 unit increments
    Vertical unit increment: 16 pixels

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

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

javax.swing.JTextArea: Mouse wheel moved UP 1 notch(es)
    Scroll type: WHEEL_BLOCK_SCROLL
    Vertical block increment: 307 pixels

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

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

public class MouseWheelEventDemo ... implements MouseWheelListener ... {
    public MouseWheelEventDemo() {
        //where initialization occurs:
        //Register for mouse-wheel events on the text area.
        textArea.addMouseWheelListener(this);
        ...
    }

    public void mouseWheelMoved(MouseWheelEvent e) {
       String message;
       int notches = e.getWheelRotation();
       if (notches < 0) {
           message = "Mouse wheel moved UP "
                        + -notches + " notch(es)" + newline;
       } else {
           message = "Mouse wheel moved DOWN "
                        + notches + " notch(es)" + newline;
       }
       if (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) {
           message += "    Scroll type: WHEEL_UNIT_SCROLL" + newline;
           message += "    Scroll amount: " + e.getScrollAmount()
                   + " unit increments per notch" + newline;
           message += "    Units to scroll: " + e.getUnitsToScroll()
                   + " unit increments" + newline;
           message += "    Vertical unit increment: "
               + scrollPane.getVerticalScrollBar().getUnitIncrement(1)
               + " pixels" + newline;
       } else { //scroll type == MouseWheelEvent.WHEEL_BLOCK_SCROLL
           message += "    Scroll type: WHEEL_BLOCK_SCROLL" + newline;
           message += "    Vertical block increment: "
               + scrollPane.getVerticalScrollBar().getBlockIncrement(1)
               + " pixels" + newline;
       }
       saySomething(message, e);
    }
    ...
}

鼠标滚轮监听器 API

MouseWheelListener interface

尽管MouseWheelListener只有一种方法,但它具有相应的适配器类MouseAdapter。此功能使应用程序仅具有一个适配器类实例即可对该组件进行 管理,以通过鼠标指针 管理 所有类型的事件.

MethodPurpose
mouseWheelMoved(MouseWheelEvent)旋转鼠标滚轮时调用。

MouseWheelEvent 类

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

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

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

ExampleWhere DescribedNotes
MouseWheelEventDemoThis section报告在文本区域内发生的所有鼠标滚轮事件,以演示触发鼠标滚轮事件的情况。