Java Swing keyEvent 与 keyPressed/keyReleased - 不同的键代码?

标签 java swing events

为什么 keyTyped 会向 keyPressed/keyReleased 返回不同的 KeyEvent?

package poke;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class PokeEvents implements KeyListener {
    static public void main(String args[]) {
        new PokeEvents();
    }

    public PokeEvents() {
        JFrame frame = new JFrame();
        frame.addKeyListener(this);
        frame.setVisible(true);
    }

    @Override
    public void keyTyped(KeyEvent e) {
        System.err.println("keyTyped: "+e.getKeyCode()+", "+e.getKeyChar()+", "+e.getExtendedKeyCode());
    }

    @Override
    public void keyPressed(KeyEvent e) {
        System.err.println("keyPressed: "+e.getKeyCode()+", "+e.getKeyChar()+", "+e.getExtendedKeyCode());
    }

    @Override
    public void keyReleased(KeyEvent e) {
        System.err.println("keyReleased: "+e.getKeyCode()+", "+e.getKeyChar()+", "+e.getExtendedKeyCode());
    }

}

运行它,按键盘上的“a”,输出为:

keyPressed: 65, a, 65
keyTyped: 0, a, 0
keyReleased: 65, a, 65

好吧,你说,看起来足够无害。让我们加大赌注。尝试将其与 Ctrl 结合起来(我们软件中暴露此问题的原始错误是处理 Ctrl 键组合)。

keyPressed: 17, , 17
keyPressed: 65, , 65
keyTyped: 0, , 0
keyReleased: 65, , 65
keyReleased: 17, , 17

请注意:17 - 控制,65 - a。

keyTyped上,无法知道该字符是什么。它似乎是一个 null 字符。

由于角色未在浏览器中呈现,因此在编辑器和 Eclipse 中如下所示:

output as pasted in the SO editer

Output as seen in Eclipse console

最佳答案

没有不同的键码。使用和不使用 Ctrl 时,“A”键生成的键码是 65。按下 Ctrl 时的不同之处在于从 getKeyChar( )。正如它应该的那样。

不,您得到的字符不是“某种 null 字符”,它是 Ctrl+A 字符,ascii 代码为 1,并且它是无法打印的。但它就在那里。你只是看不到它,因为它,呃,嗯,无法打印。

无论是否按下 Ctrl

KeyTyped 始终报告按键代码 0。 KeyEvent 类的 keyCode 成员未针对 KeyTyped 事件定义。它们只是重用相同的事件类,因此 getter 仍然可供您调用,但您不应该这样做,因为当事件为 时,您永远不会获得 keyCode 信息键输入。如果您需要 keyCode,请查看 keyPressed 事件。如果您想要一个字符,请查看 keyPressedkeyTyped 事件。

关于Java Swing keyEvent 与 keyPressed/keyReleased - 不同的键代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45462556/

相关文章:

java - 如何在 ListView 中创建 Activity

java - 是否有一个函数可以按给定顺序不断增加矩阵中的数字

java - 从 ComboBox 的内容中获取变量

java - 当我单击进度栏关闭按钮时,它应该要求确认并停止进度栏后台任务

python - Tkinter .after 方法卡住窗口?

javascript - 多个 DOM 对象的 jQuery 单事件

java - 读取文本文件并将其存储到数组中

java - 将 String 日期转换为 dd/MM/yyyy 格式的 java.util.Date

java - Swing : storing the selected values from List into an array.

c# - 我怎样才能为表单中的任何 child 捕获 MouseLeftButtonDown 事件,即使 child 捕获了这个事件?