2010-10-20 14 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) { 
    } 
} 

Lorsque j'appuie sur une touche, je reçois "0" pour la première boîte de dialogue de message et "codeTouche Unknown: 0x0" pour le second.Java KeyListener me donne "Inconnu codeTouche: 0x0"

Qu'est-ce que je fais mal?

Répondre

0

De la documentation Java pour un KeyEvent:

getKeyCode
Renvoie: le code entier pour une clé réelle sur le clavier. (Pour les événements KEY_TYPED, le code d'activation est VK_UNDEFINED.)

Vous utilisez un événement keyTyped, donc la valeur renvoyée est VK_UNDEFIED.

Vous pouvez, cependant, il suffit d'utiliser ce qui suit pour obtenir le caractère tapé:

JOptionPane.showMessageDialog(null, e.getKeyChar()); 
+0

Assez sûr que vous avez ajouté le e.getKeyChar() à votre réponse (via edit) après ma réponse a été soumise, mauvaise forme. – Syntax

0

Vous devez également cela ctach l'événement, je pense:

/** 
    * 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: En acceptant une réponse (probablement la meilleure réponse) en cliquant sur la coche ci-dessous dans le coin supérieur gauche de la réponse (ci-dessous le grand nombre). – Anthony

+0

Très bien, merci – w4j3d

+0

Il n'a pas besoin d '"attraper l'événement". Il reçoit les événements correctement. – Grodriguez

1

Utilisez e.getKeyChar()

+1

renvoie un signe carré étrange, pas la clé réelle. ne pas aider. – Blauhirn

0

Vous pouvez obtenir trois types d'événements: KEY_PRESSED, KEY_RELEASED, et KEY_TYPED événements. Les deux premiers sont associés à l'action en appuyant et en relâchant les touches du clavier (qui peut ou ne peut pas donner lieu à un caractère étant typé), tandis que le troisième est associé à la saisie de caractères:

  • Pour KEY_PRESSED et KEY_RELEASED événements:
    • e.getKeyCode() renvoie un code clé valide
    • e.getKeyChar() retours CHAR_UNDEFINED
  • Pour KEY_TYPED événements:
    • e.getKeyChar() retourne char Unicode valide
    • e.getKeyCode() retours VK_UNDEFINED

Votre code écoute KEY_TYPED événements, mais en utilisant e.getKeyCode() qui est valable uniquement pour les KEY_PRESSED et KEY_RELEASED événements.

1

Vous devez obtenir KeyCode dans KeyPressed événement et vous pouvez l'utiliser dans KeyTyped, bien sûr la variable que vous utiliserez doit être déclarée en dehors de ces deux événements.

2

Il semble que vous ayez une disposition non américaine par défaut. Java ne l'aime pas et génère des événements avec des codes clés invalides. En guise de contre-mesure, vous pouvez attribuer une disposition primaire aux États-Unis.

+0

Mon problème est apparu dans Ubuntu 13.04 et IntellijIDEA 12.10. Je n'étais pas en mesure d'utiliser la combinaison de touches, en réglant la disposition du clavier anglais pour être le problème par défaut. – Adelin