自从上个世纪以来 Java 开发者就嚷着要求的一个功能是支持鼠标滚轮旋转事件。随着 Merlin 发行版的出现,现在您可以为任何 Component 增加一个 MouseWheelListener 并做出相应的响应。除了前面提及的错误之外,它运行得很顺利。 JScrollPane 组件甚至随预注册的侦听器一起提供,所以当这个组件获得焦点且用户移动鼠标滚轮时窗格将会滚动。
该侦听器有一个方法, mouseWheelMoved() ,它获取一个 MouseWheelEvent 参数。在事件中,您可以使用 getScrollAmount() 查明滚动总量,使用 getScrollType() 查明是单元滚动还是块滚动、使用 getWheelRotation 查明滚动方向和鼠标滚轮旋转的次数,为方便起见,还可以使用 getUnitsToScroll() 查明要滚动的单元。
在测试程序中,我们增加了一个鼠标滚轮侦听器,它让背景色按照某一方向在颜色数组中循环,如清单 4 所示。文档声明鼠标滚轮事件向上传递容器层次结构,但错误导致这件事无法发生,所以您需要为按钮增加一个侦听器。确保在 main() 方法中添加一个侦听器。
清单 4. 增加鼠标滚轮侦听器
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. 增加键侦听器
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