【问题标题】:Java get keyboard key typed in a functionJava获取在函数中键入的键盘键
【发布时间】:2019-06-02 12:17:35
【问题描述】:

所以我正在用 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。这里的挑战显然是无法判断 keytype 何时结束。例如,在 Unity 中,当您在 c# 中编码时,您可以执行 Input.GetKeyDown("E") 之类的操作,它会测试键类型,而 Input.GetKey("E") 会检测它是否被按住。任何帮助将不胜感激。

【问题讨论】:

    标签: java swing jframe keylistener


    【解决方案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 中存储要使用的所有操作的列表或映射,并使用事件的键码来查找具有该键码的操作。

    【讨论】:

    • 这是一个很好的方法,但是我有一个静态类并且想要一个静态函数来测试是否键入了键。不过感谢您的回答。
    • @oriont 根据所需的行为(例如,您的静态 isKeyTyped 方法在键入键后返回 true 的时间),您可以存储另一个键入的键 Map&lt;Integer, Boolean&gt; 并将键码翻转为truekeyTyped 中,然后在isKeyTyped 中访问它时,将键码翻转回false
    【解决方案2】:

    在我正在进行的项目中,我的主要侦听器与某些可见的面板相关联。 (同一个键有类似动作的变体,例如KeyEvent.VK_ENTER 用于提交)

    你也许可以实现一个中间人标志,当按键被按下时切换,当按键可以再次按下/注册时切换回来。

    这个链接 java keylistener not called 对我非常有用,因为我还需要 keyBindings(TextField 和 JPanel 侦听器)

    【讨论】:

    • @Vulcan 对他的帖子的评论与我带着中间人标志去哪里的路线相同
    猜你喜欢
    • 1970-01-01
    • 2011-10-19
    • 2020-11-09
    • 2011-08-03
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    相关资源
    最近更新 更多