Swing的KeyListener和多个按键同时按下

新手上路,请多包涵

当同时按下两个键盘键时,是否有任何传统的方式来跟踪事件?我有几个想法,例如记住键和事件生成时间,这样我们就可以在连续的事件处理程序调用中检查这两个事件之间的时间差并决定它是否是双按钮事件。但它看起来像一个kludge。

原文由 Maksim Skurydzin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 692
2 个回答

使用集合来记住当前按下了哪些键,并在每次按下某个键时检查是否按下了多个键。

 class MultiKeyPressListener implements KeyListener {
    // Set of currently pressed keys
    private final Set<Integer> pressedKeys = new HashSet<>();

    @Override
    public synchronized void keyPressed(KeyEvent e) {
        pressedKeys.add(e.getKeyCode());
        Point offset = new Point();
        if (!pressedKeys.isEmpty()) {
            for (Iterator<Integer> it = pressedKeys.iterator(); it.hasNext();) {
                switch (it.next()) {
                    case KeyEvent.VK_W:
                    case KeyEvent.VK_UP:
                        offset.y = -1;
                        break;
                    case KeyEvent.VK_A:
                    case KeyEvent.VK_LEFT:
                        offset.x = -1;
                        break;
                    case KeyEvent.VK_S:
                    case KeyEvent.VK_DOWN:
                        offset.y = 1;
                        break;
                    case KeyEvent.VK_D:
                    case KeyEvent.VK_RIGHT:
                        offset.x = 1;
                        break;
                }
            }
        }
        System.out.println(offset); // Do something with the offset.
    }

    @Override
    public synchronized void keyReleased(KeyEvent e) {
        pressedKeys.remove(e.getKeyCode());
    }

    @Override
    public void keyTyped(KeyEvent e) { /* Event not used */ }
}

原文由 Ben S 发布,翻译遵循 CC BY-SA 4.0 许可协议

KeyListener 接口允许分别检测按键的按下和释放。因此,您可以维护一组“活动键”,即已按下但尚未释放的键。

原文由 Eyal Schneider 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题