2017-08-02 27 views
0

爲什麼keyTyped將不同的KeyEvent返回keyPressed/keyReleased?Java Swing keyEvent vs 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 

OK,似乎很無害的,你說。讓我們去賭注。嘗試將它與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

回答

3

有沒有不同的鍵碼。有或沒有Ctrl,由「A」鍵生成的關鍵代碼是65.當Ctrl被按下時,什麼不同是從getKeyChar()得到的字符。正如它應該。

不,你得到的字符不是「null種類的字符」,它是Ctrl+A字符,ASCII碼爲1,並且它是不可打印的。但它在那裏。你只是沒有看到它,因爲它,嗯,好,不可打印。

KeyTyped總是關鍵代碼報道0,Ctrl是否被按下。對於KeyTyped事件,KeyEvent類的keyCode成員未定義。他們只是重複使用相同的事件類,所以吸氣者仍然在那裏給你打電話,但你不應該這樣做,因爲當事件是KeyTyped時,你永遠不會得到keyCode信息。如果您需要keyCode,請查看keyPressed事件。如果您想要角色,請查看keyPressedkeyTyped事件。

+0

這不符合原始問題的答案。爲什麼鍵碼不同,即使是基本的'a'字符? –

+0

沒有不同的鍵碼。鍵碼是65,這是「A」鍵的鍵碼。性格不同。正如它應該。如果按住Ctrl並按下A,則會出現Ctrl + A字符。 –

+0

「有和沒有Ctrl,由」A「鍵生成的鍵碼是65.」 顯然不是真的。你見過輸出嗎? –