技术开发 频道

AWT摘要

         自从上个世纪以来 Java 开发者就嚷着要求的一个功能是支持鼠标滚轮旋转事件。随着 Merlin 发行版的出现,现在您可以为任何 Component 增加一个 MouseWheelListener 并做出相应的响应。除了前面提及的错误之外,它运行得很顺利。 JScrollPane 组件甚至随预注册的侦听器一起提供,所以当这个组件获得焦点且用户移动鼠标滚轮时窗格将会滚动。

  该侦听器有一个方法, mouseWheelMoved() ,它获取一个 MouseWheelEvent 参数。在事件中,您可以使用 getScrollAmount() 查明滚动总量,使用 getScrollType() 查明是单元滚动还是块滚动、使用 getWheelRotation 查明滚动方向和鼠标滚轮旋转的次数,为方便起见,还可以使用 getUnitsToScroll() 查明要滚动的单元。

  在测试程序中,我们增加了一个鼠标滚轮侦听器,它让背景色按照某一方向在颜色数组中循环,如清单 4 所示。文档声明鼠标滚轮事件向上传递容器层次结构,但错误导致这件事无法发生,所以您需要为按钮增加一个侦听器。确保在 main() 方法中添加一个侦听器。

  清单 4. 增加鼠标滚轮侦听器

1 private static void attachMouseWheelListener(final JFrame frame) {
2     MouseWheelListener listener = new MouseWheelListener() {
3       public void mouseWheelMoved(MouseWheelEvent e) {
4         int count = e.getWheelRotation();
5         int direction = (Math.abs(count) > 0) ? UP : DOWN;
6         changeBackground(frame, direction);
7       }
8     };
9     button.addMouseWheelListener(listener);
10   }
11

  输入事件

  这最后一个功能比您刚开始想象的要多一些,因为测试程序只使用了已添加的功能的一小部分。基本上,Merlin 添加了区别同一键的不同版本(键区键和常规键)以及键盘键和鼠标按钮的不同次序的功能。例如,以前无法说出按下 shift 再单击和单击不同按钮之间的不同;两者产生相同的鼠标事件。有了 InputEvent 类中下列新常量的帮助,一切都不同了:

  ALT_DOWN_MASK

  CTRL_DOWN_MASK

  META_DOWN_MASK

  SHIFT_DOWN_MASK

  BUTTON1_DOWN_MASK

  BUTTON2_DOWN_MASK

  BUTTON3_DOWN_MASK

  BUTTON1_CHANGED_MASK

  BUTTON2_CHANGED_MASK

  BUTTON3_CHANGED_MASK

  如果您想找出按下的是哪个按钮,下列方法更常用:

  isButton1Down()

  isButton2Down()

  isButton3Down()

  MouseEvent 还提供 getButton() 方法用来发现哪个按钮改变了状态。

  所有这些方法和常量应该会使得对按钮事件做出响应更加容易。

  区分同一个键的不同版本要求对 KeyEvent 类做一些修改。您可以使用 getKeyLocation() 从事件中得到键的位置;您会重新使用下列常量之一:

  KEY_LOCATION_LEFT

  KEY_LOCATION_NUMPAD

  KEY_LOCATION_RIGHT

  KEY_LOCATION_STANDARD

  KEY_LOCATION_UNKNOWN

  通过询问键的位置,您可以区分小键盘键、标准键以及左和右 shift 键。

  对于测试程序,我们只简单地让键侦听器根据按下的是左还是右 shift 键按向上或向下的方向循环,如清单 5 所示。我们务必要首先核实按下的是哪个键,然后再检查其位置。当然,还要在 main() 方法中添加对例程的调用。

  清单 5. 增加键侦听器

1 private static void attachKeyListener(final JFrame frame) {
2     KeyListener listener = new KeyAdapter() {
3       public void keyPressed(KeyEvent e) {
4         if (e.getKeyCode() == KeyEvent.VK_SHIFT) {
5           int location = e.getKeyLocation();
6           int direction = (location == KeyEvent.KEY_LOCATION_LEFT) ?
7             UP : DOWN;
8           changeBackground(frame, direction);
9         }
10       }
11     };
12     button.addKeyListener(listener);
13   }
14
0
相关文章