KeyStroke.getKeyStroke获取的KeyStroke缺失字符值问题求助
问题:KeyStroke.getKeyChar()始终返回0xFFFF,无法获取外文输入法对应字符
我正在开发一款可显示选中键盘按键对应字符的应用,方便使用外文输入法的用户查看输入内容。但调用KeyStroke.getKeyStroke(int keyCode, int modifiers)方法后,返回的KeyStroke对象调用getKeyChar()始终返回0xFFFF。
测试代码
public void showKeys() { Field[] fields = KeyEvent.class.getDeclaredFields(); Map<Integer, Field> fieldMap = new TreeMap<>(); for (Field f : fields) { if ((f.getType() == Integer.TYPE) && f.getName().startsWith("VK")) { try { int value = (Integer) f.get(null); fieldMap.put(value, f); } catch (IllegalAccessException e) { throw new IllegalStateException("Should not happen", e); } } } for (int value = 44; value <= 90; ++value) { Field field = fieldMap.get(value); if (field != null) { // Setting the last parameter to false, or leaving it off, gives me the same thing. KeyStroke keyStroke = KeyStroke.getKeyStroke(value, 0, true); final char keyChar = keyStroke.getKeyChar(); final int keyCode = keyStroke.getKeyCode(); System.out.printf("%6d: %-30s -- %5d = 0x%04X: %c (0x%04X)%n", value, field.getName(), keyCode, keyCode, keyChar, (int) keyChar); } } }
运行结果
44: VK_COMMA -- 44 = 0x002C: Ôøø (0xFFFF) 45: VK_MINUS -- 45 = 0x002D: Ôøø (0xFFFF) 46: VK_PERIOD -- 46 = 0x002E: Ôøø (0xFFFF) 47: VK_SLASH -- 47 = 0x002F: Ôøø (0xFFFF) 48: VK_0 -- 48 = 0x0030: Ôøø (0xFFFF) 49: VK_1 -- 49 = 0x0031: Ôøø (0xFFFF) 50: VK_2 -- 50 = 0x0032: Ôøø (0xFFFF) 51: VK_3 -- 51 = 0x0033: Ôøø (0xFFFF) 52: VK_4 -- 52 = 0x0034: Ôøø (0xFFFF) 53: VK_5 -- 53 = 0x0035: Ôøø (0xFFFF) 54: VK_6 -- 54 = 0x0036: Ôøø (0xFFFF) 55: VK_7 -- 55 = 0x0037: Ôøø (0xFFFF) 56: VK_8 -- 56 = 0x0038: Ôøø (0xFFFF) 57: VK_9 -- 57 = 0x0039: Ôøø (0xFFFF) 59: VK_SEMICOLON -- 59 = 0x003B: Ôøø (0xFFFF) 61: VK_EQUALS -- 61 = 0x003D: Ôøø (0xFFFF) 65: VK_A -- 65 = 0x0041: Ôøø (0xFFFF) 66: VK_B -- 66 = 0x0042: Ôøø (0xFFFF) 67: VK_C -- 67 = 0x0043: Ôøø (0xFFFF) 68: VK_D -- 68 = 0x0044: Ôøø (0xFFFF) 69: VK_E -- 69 = 0x0045: Ôøø (0xFFFF) 70: VK_F -- 70 = 0x0046: Ôøø (0xFFFF) 71: VK_G -- 71 = 0x0047: Ôøø (0xFFFF) 72: VK_H -- 72 = 0x0048: Ôøø (0xFFFF) 73: VK_I -- 73 = 0x0049: Ôøø (0xFFFF) 74: VK_J -- 74 = 0x004A: Ôøø (0xFFFF) 75: VK_K -- 75 = 0x004B: Ôøø (0xFFFF) 76: VK_L -- 76 = 0x004C: Ôøø (0xFFFF) 77: VK_M -- 77 = 0x004D: Ôøø (0xFFFF) 78: VK_N -- 78 = 0x004E: Ôøø (0xFFFF) 79: VK_O -- 79 = 0x004F: Ôøø (0xFFFF) 80: VK_P -- 80 = 0x0050: Ôøø (0xFFFF) 81: VK_Q -- 81 = 0x0051: Ôøø (0xFFFF) 82: VK_R -- 82 = 0x0052: Ôøø (0xFFFF) 83: VK_S -- 83 = 0x0053: Ôøø (0xFFFF) 84: VK_T -- 84 = 0x0054: Ôøø (0xFFFF) 85: VK_U -- 85 = 0x0055: Ôøø (0xFFFF) 86: VK_V -- 86 = 0x0056: Ôøø (0xFFFF) 87: VK_W -- 87 = 0x0057: Ôøø (0xFFFF) 88: VK_X -- 88 = 0x0058: Ôøø (0xFFFF) 89: VK_Y -- 89 = 0x0059: Ôøø (0xFFFF) 90: VK_Z -- 90 = 0x005A: Ôøø (0xFFFF)
尝试使用KeyEvent.getKeyText(int keyCode)方法仅支持英文,切换日语输入法后仍返回英文按键名称。已尝试该方法的两个重载版本,结果一致;遍历KeyStroke类所有字段也得到相同结果。请问是我的操作有误,还是该方法存在bug?
内容的提问来源于stack exchange,提问作者MiguelMunoz
相关产品推荐
相关产品推荐

