Java获取在功能中键入的键盘键

时间:2019-01-07 20:06:57

标签: java swing jframe keylistener

所以我正在用Java做游戏,而我目前正在使用键盘输入。我有一个称为KeyboardManager的keylistener类设置,其中有一个静态函数,用于检测是否按住了某个键。这是该类的代码:

public class KeyboardManager implements KeyListener {

    public static Map<Integer, Boolean> keys;

    public KeyboardManager () {
        keys = new HashMap<>();
    }


    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        keys.put(e.getKeyCode(), true);
    }

    @Override
    public void keyReleased(KeyEvent e) {
        keys.put(e.getKeyCode(), false);
    }

    public static boolean isKeyDown(int key) {
        if (!keys.containsKey(key)) return false;
        return keys.get(key);
    }
}

isKeyDown函数可以很好地工作,我可以用它来移动玩家,但是,如果像想象中的那样,用它来打开gui(如玩家清单),它就会打开和关闭每个刻度。我正在寻找一种方法来完成现在的工作,但是使用keyTyped而不是keyPressedkeyReleased。显然,这里的挑战是没有办法知道键类型何时结束。例如,在Unity中,当您使用c#进行编码时,可以执行类似Input.GetKeyDown("E")的操作,它将测试密钥类型,而Input.GetKey("E")将检测其是否被按下。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

keyTyped在释放键时被触发,因此您可以将事件响应添加到事件处理函数本身中,而不用检查其他地方是否按下了键:

@Override
public void keyTyped(KeyEvent e) {
    int code = e.getKeyCode();
    if (code == KeyEvent.VK_I) {
        if (!isInventoryOpen) {
            openInventory();
        } else {
            closeInventory();
        }
    } else if (code == KeyEvent.VK_M) {
        // ...
    } // else if ...
}

如果您有一组复杂的交互,则可以为每个操作创建一个具有唯一子类的抽象类,其中包含适用的键代码和要执行的操作。然后,您可以存储keyTyped中要使用的所有操作的列表或映射,并使用事件的键代码来查找具有该键代码的操作。

答案 1 :(得分:0)

在我正在处理的项目中,我的关键侦听器与某些可见的面板相关联。 (相同的键具有类似操作的变体,例如KeyEvent.VK_ENTER用于提交)

您也许可以实现一个中间人标志,即在按下该键时可以切换的标志,而在可以再次按下/注册该键时可以切换回的标志。

此链接java keylistener not called对我来说非常有用,因为我也需要keyBindings(TextField和JPanel侦听器)