background image

Java 编程:Swing 中的键盘事件处理

在 Java Swing 编程过程中,经常需要处理键盘事件,例如处理快捷键等。这里就介绍如
何定义键盘事件,以及如何处理这些事件。
  在 jdk1.2 中,分别针对 Jcomponent 和 Text 类的对象定制了不同的处理键盘事件
的方法:在 Jcomponent 中,定义了 registerKeyboardAction 方法,使用这个方法来
将需要处理的键盘事件以及处理事件的行为绑定在一起。Text 类中具有 keymap 对象,
同 Jcomponent 中的处理方法类似,这个对象保存着需要处理的键盘事件和对应的行为。
  而在 jdk1.3 中,使用一种新的方法来处理键盘事件,它将 jdk1.2 的两种方法整合
在一起。不需要区分被处理的是 Jcomponent 还是 Text 类型的组件。它定义了两个新的类:
InputMap 和 ActionMap。他们均是简单的表或映射。一个 InputMap 将一个 Keystroke
对应到一个对象,ActionMap 将一个对象对应到一个行为(Action)。通常 InputMap 中
KeyStroke 所对应的对象是一个字符串,通过这个字符串可以在 ActionMap 中查找到相
应的行为。
  InputMap 和 ActionMap 中均有 put 方法。InputMap 的 put 方法可以将 Keystroke
对应到一个对象,而 ActionMap 的 put 方法可以将一个对象对应到一个行为。
    在 每 一 个 Jcomponent 组 件 中 , 会 有 三 个 缺 省 的 InputMap 和 一 个 缺 省 的
ActionMap。他们可以通过调用 getInputMap(int condition)和 getActionMap()得到。
三个 InputMap 分别是当组件本身拥有焦点时的 InputMap(WHEN_FOCUSED),当组
件的祖先拥有焦点时的 InputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
和组件所在的窗体具有焦点时的 InputMap(WHEN_IN_FOCUSED_WINDOW)(括号内
表示为了得到这些 InputMap,应该在 getInputMap 中设置的参数)。以下分别说明这三
种 InputMap:
  1. 组件本身拥有焦点时的 InputMap:当组件拥有焦点时,键盘按键按下,则 java
在这个 InputMap 中查找键盘事件所对应的 KeyStroke 对象。
  2. 组件的祖先拥有焦点时的 InputMap:当组件的祖先拥有焦点时,键盘按键按下,
则 java 查找这个 InputMap。
  3. 组件所在的窗口拥有焦点时的 InputMap:当组件所在的窗口具有焦点时,键盘
按键按下,则 java 查找这个 InputMap。
  当一个键被按下,这个事件被转化成一个 KeyStroke 对象,java 会查找这个
Jcomponent 的相应 InputMap(例如,当组件的祖先具有焦点时,java 就查找这个
Jcomponent 的祖先拥有焦点的 InputMap)中是否有这个 KeyStroke,如果有,取出它
所对应的对象(通常是字符串),利用这个对象在这个 Jcomponent 的 ActionMap 中查找,
如果找到对应的行为(Action),则 java 执行这个行为的 actionPerformed 方法(随后介
绍这个方法)。从而达到处理键盘事件的目的。
  每一个 InputMap 可以具有 parent 属性,这个属性的值是一个 InputMap。当在一
个 InputMap 中查找不到键盘事件的 KeyStroke 时,java 会自动在它的 parent 属性指
定的 InputMap 中查找,依次向上查找,直至找到。使用 parent 的好处是:当有一些固
定的,不希望用户进行改动的键盘映射可以存放在 parent 属性所指定的 InputMap 中,
从而避免被意外修改;另外可以将多个 Jcomponent 的缺省 InputMap 设置具有相同的
parent,使得可以共享一些键盘绑定的设置。可以通过 InputMap 类的 setparent()方法