程序功能
捕捉用户在键盘上的按键,按键分为三种类型:
1. 操作键(Action Key)(箭头、Home、End、翻页键、功能键(F1-F12)、INSERT键、PRINT SCREEN键、CAPS LOCK键、WINDOWS键等,但不包括DELETE键)
2. 普通键(Key)(字符键,包括字母、数字、标点符号、特殊符号、确认键、删除键、回退键等)
3. 辅助键(Modifier Key)(转换键SHIFT、控制键CTRL、替换键ALT等)
注:TAB键和FN键未被本程序识别,难道是不属于以上类型?
总结如下:由下表测试结果小结来看,普通键和操作键、辅助键的最大区别在于普通键按住不放可以连续输入,而另外两种按键则不行。
按键类型 | 按键动作类型 | 键盘事件类型 |
操作键 | 按住不放 | keyPressed |
操作键 | 按一下松开 | keyReleased |
字符键 | 按住不放 | keyTyped |
字符键 | 按一下松开 | keyReleased |
辅助键 | 按住不放 | keyPressed |
辅助键 | 按一下松开 | keyReleased |
运行结果示例:
代码:
注:本文代码基于Java How to Program, 第10版, 第12章:GUI组件修改而成。
1. 测试类
// Fig. 12.37: KeyDemo.java
// Testing KeyDemoFrame.
import javax.swing.JFrame;
public class KeyDemo
{
public static void main(String[] args)
{
KeyDemoFrame keyDemoFrame = new KeyDemoFrame();
keyDemoFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
keyDemoFrame.setSize(1000, 300);
keyDemoFrame.setVisible(true);
}
} // end class KeyDemo
2. 实体类
// Fig. 12.36: KeyDemoFrame.java
// Key event handling.
import java.awt.Color;
import java.awt.Font;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class KeyDemoFrame extends JFrame implements KeyListener
{
/**
*
*/
private static final long serialVersionUID = 1L;
private String line1 = ""; // first line of textarea
private String line2 = ""; // second line of textarea
private String line3 = ""; // third line of textarea
private JTextArea textArea; // textarea to display output
// KeyDemoFrame constructor
public KeyDemoFrame()
{
super("Demonstrating Keystroke Events(键盘按键事件演示程序)");
textArea = new JTextArea(30, 45); // set up JTextArea
textArea.setText("Press any key on the keyboard...(请按下键盘上的任意按键)");
textArea.setEnabled(false);
textArea.setDisabledTextColor(Color.BLACK);
textArea.setFont(new Font("Sun", Font.PLAIN, 20));
add(textArea); // add textarea to JFrame
addKeyListener(this); // allow frame to process key events
}
// handle press of any key
@Override
public void keyPressed(KeyEvent event)
{
line1 = String.format("Key pressed(按键已按下且未被松开): %s",
KeyEvent.getKeyText(event.getKeyCode())); // show pressed key
setLines2and3(event); // set output lines two and three
}
// handle release of any key
@Override
public void keyReleased(KeyEvent event)
{
line1 = String.format("Key released(按键已松开): %s",
KeyEvent.getKeyText(event.getKeyCode())); // show released key
setLines2and3(event); // set output lines two and three
}
// handle press of an action key
@Override
public void keyTyped(KeyEvent event)
{
line1 = String.format("Key typed(按键已按下,但未松开,正在重复键入该按键): %s", event.getKeyChar());
setLines2and3(event); // set output lines two and three
}
// set second and third lines of output
private void setLines2and3(KeyEvent event)
{
line2 = String.format("This key is %san action key(该按键%s操作键:箭头、Home、End、翻页键、功能键等)",
(event.isActionKey() ? "" : "not "),(event.isActionKey() ? "是" : "不是"));
String temp = KeyEvent.getKeyModifiersText(event.getModifiers());
line3 = String.format("Modifier keys pressed(已按下的辅助键(转换键SHIFT、控制键CTRL、替换键ALT等)) : %s",
(temp.equals("") ? "none(无)" : temp)); // output modifiers
textArea.setText(String.format("%s\n%s\n%s\n",
line1, line2, line3)); // output three lines of text
}
} // end class KeyDemoFrame