2010-10-20 108 views
3
class KeyDemoFrame extends JFrame implements KeyListener 
{ 
    String line1; 
    KeyDemoFrame() 
    { 

     setTitle("hello"); 
     setSize(200,200); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
     addKeyListener(this); 
    } 

    public void keyTyped(KeyEvent e) { 
     line1 = e.getKeyText(e.getKeyCode()); 
     JOptionPane.showMessageDialog(null, e.getKeyCode()); 
     JOptionPane.showMessageDialog(null, e.getKeyText(e.getKeyCode())); 

    } 

    public void keyPressed(KeyEvent e) { 
    } 

    public void keyReleased(KeyEvent e) { 
    } 
} 

當我按任意鍵時,第一個消息對話框得到「0」,第二個得到「未知的keyCode:0x0」。Java KeyListener給我「未知的keyCode:0x0」

我在做什麼錯?

回答

0

從Java文檔爲KeyEvent

getKeyCode
返回:一個實際鍵的整數代碼鍵盤。 (對於KEY_TYPED事件,鍵代碼是VK_UNDEFINED。)

您使用的是事件的keyTyped,因此被返回的值是VK_UNDEFIED。

你可以,但是,只要使用以下方法來獲取被輸入的字符:)

+0

很確定你在我的答案被提交後添加了e.getKeyChar()到你的答案(通過編輯),差的表單。 – Syntax 2010-10-21 01:54:14

0

你還需要這ctach的情況下,我認爲:

/** 
    * Notification that an event has occured in the AWT event 
    * system 
    * 
    * @param e Details of the Event 
    */ 
    public void eventDispatched(AWTEvent e) { 
     if (e.getID() == KeyEvent.KEY_PRESSED) { 
      keyPressed((KeyEvent) e); 
     } 
     if (e.getID() == KeyEvent.KEY_RELEASED) { 
      keyReleased((KeyEvent) e); 
     } 
     if (e.getID() == KeyEvent.KEY_TYPED) { 
      keyTyped((KeyEvent) e); 
     } 
    } 
+0

@ w4j3d:通過點擊答案左下角的複選標記(大數字下方)接受答案(推測爲最佳答案)。 – Anthony 2010-10-20 15:24:07

+0

好的,謝謝 – w4j3d 2010-10-20 15:35:00

+0

他不需要「趕上事件」。他正在接受正確的事件。 – Grodriguez 2010-10-20 15:48:01

1

使用e.getKeyChar(:KEY_PRESSEDKEY_RELEASED,和KEY_TYPED事件。前兩個相關聯的按壓和鍵盤上的釋放鍵(其可以或可以不導致被鍵入的字符)的作用,而第三個是與字符輸入相關聯:

  • 對於KEY_PRESSEDKEY_RELEASED事件:
    • e.getKeyCode()返回一個有效的鍵碼
    • e.getKeyChar()回報CHAR_UNDEFINED
  • 對於KEY_TYPED事件:
    • e.getKeyChar()返回一個有效的Unicode字符
    • e.getKeyCode()回報VK_UNDEFINED

你的代碼是聽KEY_TYPED事件,但是如果使用e.getKeyCode()這是僅適用於KEY_PRESSEDKEY_RELEASED事件。

+1

返回一些奇怪的方形符號,而不是實際的鍵。沒有幫助。 – Blauhirn 2015-03-18 19:57:26

0

你可能會得到三種類型的事件

JOptionPane.showMessageDialog(null, e.getKeyChar()); 
1

您需要在KeyPressed事件中獲得KeyCode事件,然後您可以在KeyTyped中使用它,當然,您將使用的變量必須在這兩個事件之外進行聲明。

2

看起來您已將非美國佈局視爲默認佈局。 Java不喜歡它,並生成具有無效鍵碼的事件。作爲一種對策,您可以爲美國分配主要佈局。

+0

我的問題出現在Ubuntu 13.04和IntellijIDEA 12.10中。我無法使用Keys組合,將鍵盤佈局英語設置爲默認解決問題。 – Adelin 2013-08-18 00:51:37