502.md 7.6 KB
Newer Older
W
init  
wizardforcel 已提交
1 2 3 4
# 如何编写鼠标滚轮监听器

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

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

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

W
wizardforcel 已提交
9
通常没有必要实现鼠标滚轮监听器,因为鼠标滚轮主要用于滚动。滚动窗格会自动注册对鼠标滚轮作出适当反应的鼠标滚轮监听器。
W
init  
wizardforcel 已提交
10 11 12

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

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

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

W
wizardforcel 已提交
17
![](img/f727de06d91f1422cd29860799dfa939.jpg)
W
init  
wizardforcel 已提交
18 19 20 21 22 23 24 25

* * *

**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.  将光标移到文本区域上。
W
wizardforcel 已提交
26 27
3.  将鼠标滚轮远离您。您将在*向上*方向看到一个或多个鼠标滚轮事件。
4.  沿相反方向旋转鼠标滚轮。您将在*向下*方向看到鼠标滚轮事件。
W
init  
wizardforcel 已提交
28 29 30 31 32 33
5.  尝试更改鼠标滚轮在系统鼠标控制面板上的滚动行为,以查看输出如何变化。您不需要重新启动演示以查看更改是否生效。

* * *

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

W
wizardforcel 已提交
34
```java
W
init  
wizardforcel 已提交
35 36 37 38 39 40 41 42 43 44 45 46
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)。

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

W
wizardforcel 已提交
47
```java
W
init  
wizardforcel 已提交
48 49 50 51 52 53 54 55 56 57
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) 文件中找到演示代码。以下代码段与鼠标滚轮事件处理有关:

W
wizardforcel 已提交
58
```java
W
init  
wizardforcel 已提交
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
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`时有效。 |

W
wizardforcel 已提交
112
下表列出了使用鼠标滚轮监听器的示例。
W
init  
wizardforcel 已提交
113 114 115 116

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