![](/img/trans.png)
[英]How to stop repeated keyPressed() / keyReleased() events in Swing
[英]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中相同:
沒有不同的鍵碼。 在使用和不使用Ctrl
,由“ A”鍵生成的鍵代碼為65。按下Ctrl
時的區別是從getKeyChar()
獲得的字符。 正如它應該。
不,您得到的字符不是“某種null
字符”,它是Ctrl+A
字符,帶有ascii代碼1,並且不可打印。 但它在那里。 您只是看不到它,因為它是不可打印的。
無論是否Ctrl
鍵, KeyTyped
始終將鍵代碼報告為0。 對於KeyTyped
事件,未定義KeyEvent
類的keyCode
成員。 它們只是重用了相同的事件類,因此getter仍然可供您調用,但是您不應該這樣做,因為當事件為KeyTyped
時,您永遠不會獲得keyCode
信息。 如果需要keyCode
,請查看keyPressed
事件。 如果需要字符,請查看keyPressed
或keyTyped
事件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.