502.md 7.6 KB
Newer Older
W
init  
wizardforcel 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
# 如何编写鼠标滚轮监听器

> 原文: [https://docs.oracle.com/javase/tutorial/uiswing/events/mousewheellistener.html](https://docs.oracle.com/javase/tutorial/uiswing/events/mousewheellistener.html)

鼠标滚轮事件在鼠标滚轮旋转时通知。有关收听其他鼠标事件(如点击)的信息,请参阅[如何编写鼠标侦听器](mouselistener.html)。有关收听鼠标拖动事件的信息,请参阅[如何编写鼠标 - 运动监听器](mousemotionlistener.html)。并非所有鼠标都有轮子,在这种情况下,鼠标轮事件永远不会产生。无法以编程方式检测鼠标是否配备鼠标滚轮。

或者,使用实现`MouseWheelListener`接口的相应 [`MouseAdapter`](https://docs.oracle.com/javase/8/docs/api/java/awt/event/MouseAdapter.html) AWT 类创建`MouseWheelEvent`并覆盖特定事件的方法。

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

但是,要创建要在滚动窗格内使用的自定义组件,您可能需要自定义其滚动行为 - 特别是您可能需要设置单位和块增量。例如,对于文本区域,滚动一个单位意味着滚动一行文本。块增量通常会滚动整个“页面”或视口的大小。有关更多信息,请参阅[如何使用滚动窗格](../components/scrollpane.html)页面中的[实现滚动 - 精明客户端](../components/scrollpane.html#scrollable)

要生成鼠标滚轮事件,光标必须是 _ 超过 _ 注册的组件以侦听鼠标滚轮事件。发生的滚动类型(`WHEEL_UNIT_SCROLL``WHEEL_BLOCK_SCROLL`)取决于平台。鼠标滚轮滚动的数量也取决于平台。可以通过平台的鼠标控制面板设置滚动的类型和数量。

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

<center>![](img/f727de06d91f1422cd29860799dfa939.jpg)</center>

* * *

**Try this:** 

1.  单击“启动”按钮以使用 [Java™Web Start](http://www.oracle.com/technetwork/java/javase/javawebstart/index.html)[下载 JDK 7 或更高版本](http://www.oracle.com/technetwork/java/javase/downloads/index.html))运行 MouseWheelEventDemo。或者,要自己编译并运行示例,请参考[示例索引](../examples/events/index.html#MouseWheelEventDemo)[![Launches the MouseWheelEventDemo application](img/4707a69a17729d71c56b2bdbbb4cc61c.jpg)](https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/MouseWheelEventDemoProject/MouseWheelEventDemo.jnlp) 

2.  将光标移到文本区域上。
3.  将鼠标滚轮远离您。您将在 _ 向上 _ 方向看到一个或多个鼠标滚轮事件。
4.  沿相反方向旋转鼠标滚轮。您将在 _ 向下 _ 方向看到鼠标滚轮事件。
5.  尝试更改鼠标滚轮在系统鼠标控制面板上的滚动行为,以查看输出如何变化。您不需要重新启动演示以查看更改是否生效。

* * *

对于使用鼠标滚轮的单位增量的系统,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`](../examples/events/MouseWheelEventDemoProject/src/events/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);
    }
    ...
}

```

_ 虽然`MouseWheelListener`只有一个方法,但它有相应的适配器类 - `MouseAdapter`。此功能使应用程序只有一个适配器类实例,以便组件从鼠标指针管理所有类型的事件。_

| 方法 | 目的 |
| :-- | :-- |
| [mouseWheelMoved(MouseWheelEvent)](https://docs.oracle.com/javase/8/docs/api/java/awt/event/MouseWheelListener.html#mouseWheelMoved-java.awt.event.MouseWheelEvent-) | 旋转鼠标滚轮时调用。 |

| 方法 | 目的 |
| :-- | :-- |
| [int getScrollType()](https://docs.oracle.com/javase/8/docs/api/java/awt/event/MouseWheelEvent.html#getScrollType--) | 返回要使用的滚动类型。可能的值为`WHEEL_BLOCK_SCROLL``WHEEL_UNIT_SCROLL`,由本机平台确定。 |
| [int getWheelRotation()](https://docs.oracle.com/javase/8/docs/api/java/awt/event/MouseWheelEvent.html#getWheelRotation--) | 返回鼠标滚轮旋转的槽口数。如果鼠标滚轮朝向用户(向下)旋转,则该值为正。如果鼠标滚轮远离用户(向上)旋转,则该值为负。 |
| [int getScrollAmount()](https://docs.oracle.com/javase/8/docs/api/java/awt/event/MouseWheelEvent.html#getScrollAmount--) | 返回每个陷口应滚动的单位数。这始终为正数,仅在滚动类型为`MouseWheelEvent.WHEEL_UNIT_SCROLL`时有效。 |
| [int getUnitsToScroll()](https://docs.oracle.com/javase/8/docs/api/java/awt/event/MouseWheelEvent.html#getUnitsToScroll--) | 返回正或负单位以滚动当前事件。这仅在滚动类型为`MouseWheelEvent.WHEEL_UNIT_SCROLL`时有效。 |

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

| 例 | 在哪里描述 | 笔记 |
| :-- | :-- | :-- |
| [`MouseWheelEventDemo`](../examples/events/index.html#MouseWheelEventDemo) | 这个部分 | 报告文本区域内发生的所有鼠标滚轮事件,以演示触发鼠标滚轮事件的情况。 |