Java中VirtualKey代码的奇怪行为

时间:2013-04-10 21:27:13

标签: java hashmap ascii keyevent awtrobot

我从手机接收键盘输入,并尝试使用机器人类在计算机上显示。由于我从手机获得ascii,我有一个ascii到VirtualKey值转换的hashmap。但我目前的代码有一些奇怪的行为。当我尝试在hashmap中映射某些符号时,例如! “'@我在运行它时会得到一个NullPointer Reference异常。例如,对于!,手机发送正确的unicode值(33),在哈希表中我有(int)'!'作为键,也是33.所以它应该返回它映射到的VK_EXCLAMATION,但它返回null :(有人可以帮忙吗?

这是我的代码剪切在我查找的位置:

int unicodekey = scanner.nextInt(); //unicode
    robotkey = ascii2VK.asciiForVirtualKey.get(unicodekey);
    robot.keyPress(robotkey);
    robot.keyRelease(robotkey);

我的hashmap看起来像这样:

public class ascii2VK {
      protected static final Map<Integer, Integer> asciiForVirtualKey;
            static {
                asciiForVirtualKey = new HashMap<Integer, Integer>();
                asciiForVirtualKey.put(KeyEvent.VK_UNDEFINED, 0);
                asciiForVirtualKey.put(KeyEvent.VK_QUOTE, (int)'\'');
                asciiForVirtualKey.put(KeyEvent.VK_QUOTEDBL,(int)'"');
                asciiForVirtualKey.put(KeyEvent.VK_AMPERSAND, (int)'&');
                asciiForVirtualKey.put(KeyEvent.VK_BACK_QUOTE, (int)'`');
                asciiForVirtualKey.put(KeyEvent.VK_NUMBER_SIGN, (int)'#');
                asciiForVirtualKey.put(KeyEvent.VK_EXCLAMATION_MARK, (int)'!');
                asciiForVirtualKey.put(KeyEvent.VK_AT, (int)'@');
                asciiForVirtualKey.put(KeyEvent.VK_DOLLAR, (int)'$');
                asciiForVirtualKey.put(KeyEvent.VK_BACK_SLASH, (int)'\\');
                asciiForVirtualKey.put(KeyEvent.VK_SLASH, (int)'/');
    .
    .
    .
    .
    }

1 个答案:

答案 0 :(得分:0)

您应该在地图中反转键和值。

KeyEvent.VK_EXCLAMATION_MARK是值为0x0205(十进制517)的常量。但你试图通过33代码找到它,实际上是(int)'!'

这将是正确的排序:

asciiForVirtualKey.put((int)'!', KeyEvent.VK_EXCLAMATION_MARK);

等等。

相关问题