簡體   English   中英

Java Swing keyEvent與keyPressed / keyReleased-不同的鍵碼?

[英]Java Swing keyEvent vs keyPressed/keyReleased - different key codes?

為什么keyTyped將不同的KeyEvent返回給keyPressed / keyReleased?

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中相同:

輸出粘貼到SO編輯器中

在Eclipse控制台中看到的輸出

沒有不同的鍵碼。 在使用和不使用Ctrl ,由“ A”鍵生成的鍵代碼為65。按下Ctrl時的區別是從getKeyChar()獲得的字符。 正如它應該。

不,您得到的字符不是“某種null字符”,它是Ctrl+A字符,帶有ascii代碼1,並且不可打印。 但它在那里。 您只是看不到它,因為它是不可打印的。

無論是否Ctrl鍵, KeyTyped始終將鍵代碼報告為0。 對於KeyTyped事件,未定義KeyEvent類的keyCode成員。 它們只是重用了相同的事件類,因此getter仍然可供您調用,但是您不應該這樣做,因為當事件為KeyTyped時,您永遠不會獲得keyCode信息。 如果需要keyCode ,請查看keyPressed事件。 如果需要字符,請查看keyPressedkeyTyped事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM