OnKeyDown 事件编码不正确

OnKeyDown event incorrect encoding

我使用以下代码捕获文档接收焦点时键入的所有字符:

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 中获得正确编码的输入?

event.getNativeKeyCode()给你一个键码,不是字符。来自文档:获取与此事件关联的键代码(与物理键关联的代码)。。按下键盘上的点会给我 190。另外要提到的是Java中char是16位的类型,而int是32位的,即一般来说(char) integerVal是不安全的操作。

现在您可能想要使用的是 event.getNativeEvent().getCharCode()。问题是它总是 0 in 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());