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());
我使用以下代码捕获文档接收焦点时键入的所有字符:
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());