本教程适用于JDK 8。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言更改了解Java SE 9及后续版本中的更新语言功能的摘要。
请参阅JDK发行说明了解所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息。
按键事件指示用户在键盘上输入。具体来说,当用户按下或释放键盘键时,焦点在组件上的时候,将触发按键事件。有关焦点的详细信息,请参阅如何使用焦点子系统。
关于按键事件,会发送两种基本类型的通知:
第一种类型的事件被称为键入事件。第二种类型是按键按下或按键释放事件。
一般来说,您只对键入事件做出反应,除非您需要知道用户何时按下与字符不对应的按键。例如,要知道用户何时输入Unicode字符-无论是通过按下一个键(如'a')还是按下多个键的顺序-您需要处理键入事件。另一方面,要知道用户何时按下F1键,或者用户是否按下数字键盘上的'3'键,您需要处理按键按下事件。
要触发键盘事件,组件必须具有键盘焦点。
要使组件获得键盘焦点,请按照以下步骤进行:
isFocusable
方法返回true
。此状态允许组件接收焦点。例如,您可以通过在标签上调用setFocusable(true)
方法来启用JLabel
组件的键盘焦点。requestFocusInWindow
方法。焦点子系统会消耗焦点遍历键,如Tab和Shift Tab。如果您需要防止焦点遍历键被消耗,可以调用
component.setFocusTraversalKeysEnabled(false)
在触发按键事件的组件上。然后,您的程序必须自行处理焦点遍历。或者,您可以使用KeyEventDispatcher
类预先侦听所有按键事件。焦点页面上有关焦点子系统的详细信息。
您可以获取有关特定按键按下事件的详细信息。例如,您可以查询按下事件以确定它是否来自操作键。操作键的示例包括复制、粘贴、上翻页、撤销以及箭头和功能键。您还可以查询按下或释放事件以确定触发事件的键的位置。大多数按键事件都来自标准键盘,但某些键(如Shift)的事件包含有关用户是在键盘的左侧还是右侧按下Shift键的信息。同样,数字'2'可以从标准键盘或数字键盘上键入。
对于键入事件,您可以获取键字符值以及使用的任何修饰符。
除非它涉及到键入事件,否则不应该依赖于从getKeyChar
返回的键字符值。
下面的示例演示了键盘事件。它包含一个文本字段,您可以在其中输入内容,然后是一个文本区域,每当文本字段触发键盘事件时,它会显示一条消息。窗口底部的按钮可以清除文本字段和文本区域的内容。
你可以在KeyEventDemo.java
中找到示例代码。这是演示的按键事件处理代码:
public class KeyEventDemo ... implements KeyListener ... { ...//初始化发生的地方: typingArea = new JTextField(20); typingArea.addKeyListener(this); //如果你希望关闭焦点遍历,取消注释这行代码。 //焦点子系统会消耗焦点遍历键,比如 Tab 和 Shift Tab。 //如果取消注释下面的代码,这会禁用焦点遍历,Tab 事件将可用于按键事件监听器。 //typingArea.setFocusTraversalKeysEnabled(false); ... /** 处理文本字段的按键输入事件。 */ public void keyTyped(KeyEvent e) { displayInfo(e, "KEY TYPED: "); } /** 处理文本字段的按键按下事件。 */ public void keyPressed(KeyEvent e) { displayInfo(e, "KEY PRESSED: "); } /** 处理文本字段的按键释放事件。 */ public void keyReleased(KeyEvent e) { displayInfo(e, "KEY RELEASED: "); } ... private void displayInfo(KeyEvent e, String keyStatus){ //如果事件是按键输入事件,你应该只依赖于按键字符。 int id = e.getID(); String keyString; if (id == KeyEvent.KEY_TYPED) { char c = e.getKeyChar(); keyString = "按键字符 = '" + c + "'"; } else { int keyCode = e.getKeyCode(); keyString = "按键代码 = " + keyCode + " (" + KeyEvent.getKeyText(keyCode) + ")"; } int modifiersEx = e.getModifiersEx(); String modString = "扩展修饰键 = " + modifiersEx; String tmpString = KeyEvent.getModifiersExText(modifiersEx); if (tmpString.length() > 0) { modString += " (" + tmpString + ")"; } else { modString += " (无扩展修饰键)"; } String actionString = "动作键? "; if (e.isActionKey()) { actionString += "是"; } else { actionString += "否"; } String locationString = "按键位置:"; int location = e.getKeyLocation(); if (location == KeyEvent.KEY_LOCATION_STANDARD) { locationString += "标准"; } else if (location == KeyEvent.KEY_LOCATION_LEFT) { locationString += "左"; } else if (location == KeyEvent.KEY_LOCATION_RIGHT) { locationString += "右"; } else if (location == KeyEvent.KEY_LOCATION_NUMPAD) { locationString += "数字键盘"; } else { // (location == KeyEvent.KEY_LOCATION_UNKNOWN) locationString += "未知"; } ...//显示有关 KeyEvent 的信息... } }
对应的适配器类是 KeyAdapter
。
方法 | 目的 |
---|---|
keyTyped(KeyEvent) | 在用户将一个 Unicode 字符键入被监听的组件后调用。 |
keyPressed(KeyEvent) | 在用户按下键时,被监听的组件具有焦点时调用。 |
keyReleased(KeyEvent) | 在用户释放键时,被监听的组件具有焦点时调用。 |
KeyEvent 类从 InputEvent 类继承了许多有用的方法,例如 getModifiersEx,并从 ComponentEvent 类和 AWTEvent 类继承了几个有用的方法。请参阅鼠标监听器页面的 InputEvent 类表以获取完整列表。
方法 | 目的 |
---|---|
int getKeyChar() | 获取与此事件关联的Unicode字符。仅对键入事件可靠地使用此值。 |
int getKeyCode() | 获取与此事件关联的键码。键码标识用户按下或释放的键盘上的特定键。KeyEvent类为常见的键定义了许多键码常量。例如,VK_A指定标有A的键,VK_ESCAPE指定Escape键。 |
String getKeyText(int) String getKeyModifiersText(int) |
返回事件的键码和修饰键的文本描述。 |
int getModifiersEx() String getModifiersExText(int modifiers) |
返回此事件的扩展修饰键掩码。这些方法是从InputEvent类继承的。扩展修饰键表示所有模态键的状态。getModifiersExText方法返回描述扩展修饰键和鼠标按钮的字符串。由于getModifiersEx和getModifiersExText方法提供了关于按键事件更多的信息,它们优先于getKeyText或getKeyModifiersText方法。 |
boolean isActionKey() | 如果触发事件的键是操作键,则返回true。操作键的示例包括剪切、复制、粘贴、上页、大写锁定、箭头和功能键。此信息仅对按下和释放键的事件有效。 |
int getKeyLocation() | 返回触发此事件的键的位置。这提供了一种区分键盘上出现多次的键(例如两个Shift键)的方法。可能的值为KEY_LOCATION_STANDARD、KEY_LOCATION_LEFT、KEY_LOCATION_RIGHT、KEY_LOCATION_NUMPAD或KEY_LOCATION_UNKNOWN。对于键入事件,此方法始终返回KEY_LOCATION_UNKNOWN。 |
以下表格列出了使用键盘监听器的示例。
示例 | 描述位置 | 注释 |
---|---|---|
KeyEventDemo |
本节 | 将在文本字段上发生的所有键盘事件报告,以展示键盘事件触发的情况。 |