提问者:小点点

JavaSwing keyEvent vs keyP的/keyReleed-不同的密钥代码?


为什么keyType将不同的KeyEvents返回给keyP的/keyRele的?

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结合起来(我们软件中暴露这一点的原始bug是处理Ctrl组合键)。

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

只是要注意:17-控制,65-a。

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

由于字符没有在浏览器中呈现,因此根据编辑器和Eclipse,它在这里:


共1个答案

匿名用户

没有不同的键码。有和没有Ctrl,“A”键生成的键码是65。按下Ctrl时不同的是您从getKeyChar()中获得的字符。应该的。

不,你得到的字符不是“anull字符”,它是Ctrl A字符,带有ascii代码1,它是不可打印的。但它就在那里。你只是看不到它,因为它是,嗯,嗯,不可打印的。

无论是否按下Ctrl,键代码总是报告0。KeyEvent类的keyCode成员没有为KeyType事件定义。它们只是重用相同的事件类,所以getter仍然在那里供您调用,但您不应该这样做,因为当事件是KeyType时,您永远不会获得keyCode信息。如果您想要一个keyCode,请查看keyPed事件。如果您想要一个字符,请查看keyP的keyType的事件。