Js键盘事件
在JavaScript中,有三种键盘事件可以用来处理键盘输入:
keydown:当用户按下键盘上的任何键时触发。如果用户按住一个键,该事件将重复触发,直到该键被释放。
keyup:当用户释放键盘上的任何键时触发。
keypress:当用户按下键盘上的字符键(包括字母、数字、符号等)时触发。在这种情况下,keydown和keyup事件不会被触发。
实例代码
// addEventListener()函数添加事件监听器,以监听keydown、keyup和keypress事件 document.addEventListener("keydown", function(event) { console.log("Key down: " + event.key); }); document.addEventListener("keyup", function(event) { console.log("Key up: " + event.key); }); // keydown和keyup事件的key属性会获取到键的名称,而keypress事件的key属性会获取到键的字符。 document.addEventListener("keypress", function(event) { console.log("Key pressed: " + event.key); });
JS 处理键盘事件的函数
addEventListener(event, function, useCapture): 添加事件监听器,监听键盘事件。
removeEventListener(event, function, useCapture): 移除事件监听器。
event.keyCode: 获取按下的键的键码。
event.key: 获取按下的键的名称。
event.altKey: 指示是否按下了Alt键。
event.ctrlKey: 指示是否按下了Ctrl键。
event.shiftKey: 指示是否按下了Shift键。
event.metaKey: 指示是否按下了特殊键(如⌘键或Windows键)。
event.preventDefault(): 阻止浏览器默认行为。
event.stopPropagation(): 阻止事件冒泡。
setTimeout(function, delay)用于在指定的毫秒数之后执行一次指定的函数
clearTimeout(timeoutID): 取消由 setTimeout() 创建的 timeout。
setInterval(function, delay): 用于按照指定时间间隔重复执行指定函数。
clearInterval(intervalID): 取消由 setInterval() 创建的 interval。
JS 处理持续按键事件
var intervalId = null;
document.addEventListener("keydown", function(event) {
// 当用户按下ArrowRight键时,检查intervalId是否为null来确定setInterval()函数是否已经被启动
if (event.key === "ArrowRight") {
if (intervalId === null) {
intervalId = setInterval(function() {
console.log("ArrowRight key is pressed");
}, 100);
}
}
});
document.addEventListener("keyup", function(event) {
// 当用户释放ArrowRight键时,我们通过调用clearInterval()函数来停止setInterval()函数
if (event.key === "ArrowRight") {
clearInterval(intervalId);
intervalId = null;
}
});
Java 键盘事件
Java中的键盘事件是指在窗口或组件中按下或释放键盘的操作。在Java中,可以使用AWT或Swing提供的类来处理键盘事件。
处理键盘事件--步骤
实现键盘事件监听器:通过在类中实现AWT或Swing提供的KeyEvent监听器接口来监听键盘事件(例如KeyListener或KeyAdapter)。
注册监听器:将键盘事件监听器注册到要监听键盘事件的组件上(例如JFrame、JPanel等)。
实现keyPressed、keyTyped和keyReleased方法:对于按下、释放和键入按键时发生的事件,Java提供了三个不同的方法来处理键盘事件。
处理常见键盘事件
了解keyCode的值:keyCode代表了按键的数字代码。Java中的键盘事件类KeyEvent包含了大量的常量来表示不同按键的keyCode值,可以通过KeyEvent.VK_*的方式来访问它们。
获取keyCode的值:在处理键盘事件时,可以通过KeyEvent对象的getExtendedKeyCode()方法来获取按键的keyCode值。
处理特殊按键:有一些按键比较特殊,例如Shift、Ctrl、Alt等。在处理这些按键时,可以查看KeyEvent对象的getModifiers()方法返回的值,以确定是哪个特殊按键被按下了。
处理组合按键事件:有时候,用户可能会按下多个按键来触发事件,例如Ctrl + A来选择所有文本。在处理组合按键事件时,必须检查所有按键是否都被按下,并且必须处理多个按键的keyCode值。
处理持续按键事件:在某些情况下,用户可能需要按住某个按键连续触发一个事件(例如,按住箭头键来控制光标移动)。在处理持续按键事件时,使用KeyEvent对象的getID()方法来检查按键的类型,以确定该事件是按下事件还是释放事件。如果是按下事件,则可以使用计时器重复触发事件。
KeyCode对照表
处理持续按键事件
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.Timer;
public class ContinuousKeyExample implements ActionListener {
private JFrame frame; // 声明一个JFrame对象
private JTextField textField; // 声明一个JTextField对象
private Timer timer; // 声明一个Timer对象
private boolean isKeyPressed = false; // 声明一个布尔类型变量
public static void main(String[] args) {
JFrame frame = new JFrame(); // 创建一个新的JFrame对象
frame.setSize(200, 200); // 设置JFrame的大小
JTextField textField = new JTextField(); // 创建一个新的JTextField对象
frame.add(textField); // 将JTextField添加到JFrame中
ContinuousKeyExample listener = new ContinuousKeyExample(frame, textField); // 创建一个新的ContinuousKeyExample对象
frame.addKeyListener(listener); // 向JFrame添加KeyListener
frame.setVisible(true); // 显示JFrame
}
// 构造函数
public ContinuousKeyExample(JFrame frame, JTextField textField) {
this.frame = frame; // 初始化成员变量
this.textField = textField;
this.timer = new Timer(100, this); // 创建一个新的Timer,以100ms间隔触发一次该对象的actionPerformed()方法
}
// 处理定时器事件
@Override
public void actionPerformed(ActionEvent e) {
// 持续按键事件处理逻辑
if (isKeyPressed) {
textField.setText(textField.getText() + "x"); // 在JTextField上添加字符“x”
}
}
// 启动定时器
public void startTimer() {
timer.start();
}
// 停止定时器
public void stopTimer() {
timer.stop();
}
// 判断定时器是否在运行
public boolean isTimerRunning() {
return timer.isRunning();
}
// 处理按键按下事件
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_X) { // 检查按下的键是否为x
if (!isKeyPressed) { // 检查isKeyPressed标志是否已被设置为true
isKeyPressed = true; // 将isKeyPressed标志设置为true
startTimer(); // 启动定时器
}
}
}
// 处理按键释放事件
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_X) { // 检查释放的键是否为x
isKeyPressed = false; // 将isKeyPressed标志设置为false
stopTimer(); // 停止定时器
}
}
public void keyTyped(KeyEvent e) {
// 处理键入按键事件
}
}
实例代码
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
public class KeyEventExample implements KeyListener {
public static void main(String[] args) {
/*
* JFrame是Java中表示窗口的一个类。
* 它是Java Swing系列中的一部分,可用于创建GUI应用程序中的顶级窗口。
* JFrame类提供了许多方法,使我们可定制窗口的外观和行为,如设置窗口的大小,位置,标题等。
*/
JFrame frame = new JFrame();
frame.setSize(200, 200); // 设置窗口的大小为200x200像素(宽,高)
frame.setVisible(true); // 将窗口设置为可见,窗口将会显示在屏幕上
frame.addKeyListener(new KeyEventExample()); // 在窗口中监听键盘事件
// 添加菜单栏
JMenuBar menubar = new JMenuBar();
frame.setJMenuBar(menubar);
// 添加菜单项
JMenu menu = new JMenu("Menu");
menubar.add(menu);
// 设置加速键
JMenuItem item = new JMenuItem("Item");
item.addActionListener(new ComboKeyExample());
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_MASK));
menu.add(item);
}
@Override
public void keyPressed(KeyEvent e) {
// 处理按下按键事件
System.out.println("Key pressed: " + e.getKeyCode());
// 检查Shift键是否同时按下
if (e.isShiftDown()) {
System.out.println("Shift key is down");
}
// 检查Ctrl键是否同时按下
if (e.isControlDown()) {
System.out.println("Ctrl key is down");
}
// 检查Alt键是否同时按下
if (e.isAltDown()) {
System.out.println("Alt key is down");
}
// 检查Ctrl+C键是否同时按下
System.out.println("Ctrl+C pressed");
}
@Override
public void keyTyped(KeyEvent e) {
// 处理键入按键事件
System.out.println("Key typed: " + e.getKeyChar());
}
@Override
public void keyReleased(KeyEvent e) {
// 处理释放按键事件
System.out.println("Key released: " + e.getKeyCode());
// 输出按键的名称
int keyCode = e.getKeyCode();
String keyText = KeyEvent.getKeyText(keyCode);
System.out.println("Key released: " + keyText);
}
}