2016-11-05 4 views
0

Я ловлю все введенный символ, когда документ получает фокус с помощью следующего кода:OnKeyDown события неправильного кодирования

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()); 

Когда устройство, которое посылает ключевые события использует ASCII (мы не можем контролировать то, что привыкает кодирование) то мы получим следующий результат:

www¾mitcom¾m3

что мы можем сделать так, чтобы мы получаем правильно закодированный ввод в Java?

ответ

2

event.getNativeKeyCode() дает вам код ключа, который не является символом. Из документации: Получает код ключа (код, связанный с физическим ключом), связанный с этим событием.. Точка, нажатая на моей клавиатуре, дает мне 190. Также упоминается в Java char 16-разрядный тип, тогда как int 32-разрядный, то есть обычно (char) integerVal является небезопасной операцией.

Теперь, что вы, вероятно, захотите использовать, является event.getNativeEvent().getCharCode(). Проблема в том, что она всегда 0 в KeyDownEvent. Поэтому я бы предложил использовать KeyPressHandler & KeyPressEvent. Ваш код выглядит так:

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

Это очень красивый ответ. Благодарю. –

Смежные вопросы