2016-11-05 1 views
0

je prends tout le caractère tapé alors que le document reçoit focus à l'aide du code ci-dessous:événement OnKeyDown codage incorrect

RootPanel.get().addDomHandler(new KeyDownHandler() { 

      @Override 
      public void onKeyDown(KeyDownEvent event) { 
       char key = (char) event.getNativeKeyCode(); 
       String keyString = String.valueOf(key); 
       if (!event.isShiftKeyDown()) 
        keyString = keyString.toLowerCase(); 
       System.out.print(keyString); 

      } 
     }, KeyDownEvent.getType()); 

Lorsque l'appareil qui envoie des événements clés est en utilisant ASCII (nous ne pouvons pas contrôler ce que l'encodage utilisée) nous obtenons le résultat suivant:

www¾mitcom¾m3

que pouvons-nous faire pour que nous obtenons l'entrée codé correctement en Java?

Répondre

2

event.getNativeKeyCode() vous donne un code clé, qui n'est pas un caractère. From documentation: Obtient le code clé (code associé à la clé physique) associé à cet événement.. Le point pressé sur mon clavier me donne 190. Aussi, en Java, char est un type à 16 bits, tandis que int est à 32 bits, c'est-à-dire généralement (char) integerVal est une opération dangereuse.

Maintenant, ce que vous voulez probablement utiliser est event.getNativeEvent().getCharCode(). Le problème est que c'est toujours 0 dans KeyDownEvent. Par conséquent, je suggère d'utiliser KeyPressHandler & KeyPressEvent. Votre code ressemblerait à:

private void onKeyPress(KeyPressEvent event) { 
    char c = (char) event.getNativeEvent().getCharCode(); 
    String s = String.valueOf(c); 
    if (event.isShiftKeyDown()) { 
    s = s.toUpperCase(); 
    } 

    GWT.log(s); 
} 

RootPanel.get().addDomHandler(this::onKeyPress, KeyPressEvent.getType()); 
+1

Ceci est une très belle réponse. Merci. –