键盘事件【JS + JAVA】

Js键盘事件 

在JavaScript中,有三种键盘事件可以用来处理键盘输入:

  1. keydown:当用户按下键盘上的任何键时触发。如果用户按住一个键,该事件将重复触发,直到该键被释放。

  2. keyup:当用户释放键盘上的任何键时触发。

  3. 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  处理键盘事件的函数

  1. addEventListener(event, function, useCapture): 添加事件监听器,监听键盘事件。

  2. removeEventListener(event, function, useCapture): 移除事件监听器

  3. event.keyCode: 获取按下的键的键码

  4. event.key: 获取按下的键的名称

  5. event.altKey: 指示是否按下了Alt键

  6. event.ctrlKey: 指示是否按下了Ctrl键

  7. event.shiftKey: 指示是否按下了Shift键

  8. event.metaKey: 指示是否按下了特殊键(如⌘键或Windows键)。

  9. event.preventDefault(): 阻止浏览器默认行为。

  10. event.stopPropagation(): 阻止事件冒泡。

  11. setTimeout(function, delay)用于在指定的毫秒数之后执行一次指定的函数

  12. clearTimeout(timeoutID): 取消由 setTimeout() 创建的 timeout。

  13. setInterval(function, delay): 用于按照指定时间间隔重复执行指定函数。

  14. 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中,可以使用AWTSwing提供的类来处理键盘事件。

处理键盘事件--步骤 

  1. 实现键盘事件监听器:通过在类中实现AWT或Swing提供的KeyEvent监听器接口来监听键盘事件(例如KeyListener或KeyAdapter)。

  2. 注册监听器:将键盘事件监听器注册到要监听键盘事件的组件上(例如JFrame、JPanel等)。

  3. 实现keyPressed、keyTyped和keyReleased方法:对于按下、释放和键入按键时发生的事件,Java提供了三个不同的方法来处理键盘事件。

处理常见键盘事件 

  1. 了解keyCode的值:keyCode代表了按键的数字代码。Java中的键盘事件类KeyEvent包含了大量的常量来表示不同按键的keyCode值,可以通过KeyEvent.VK_*的方式来访问它们。

  2. 获取keyCode的值:在处理键盘事件时,可以通过KeyEvent对象的getExtendedKeyCode()方法来获取按键的keyCode值。

  3. 处理特殊按键:有一些按键比较特殊,例如Shift、Ctrl、Alt等。在处理这些按键时,可以查看KeyEvent对象的getModifiers()方法返回的值,以确定是哪个特殊按键被按下了。

  4. 处理组合按键事件:有时候,用户可能会按下多个按键来触发事件,例如Ctrl + A来选择所有文本。在处理组合按键事件时,必须检查所有按键是否都被按下,并且必须处理多个按键的keyCode值。

  5. 处理持续按键事件:在某些情况下,用户可能需要按住某个按键连续触发一个事件(例如,按住箭头键来控制光标移动)。在处理持续按键事件时,使用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);
    }
}

猜你喜欢

转载自blog.csdn.net/Zhousan0125/article/details/131044680