【问题标题】:Why are some keypresses not being captured during multi-key combinations?为什么在多键组合过程中没有捕获某些按键?
【发布时间】:2012-02-04 06:13:32
【问题描述】:

是键盘限制问题吗?

我在玩一些代码时遇到了问题。想象一个自上而下的太空射击游戏。我遇到的问题是,在我的电脑上,当我按住向上和向左箭头时,我无法射击(空格键)。任何其他方向(上、下、左、右、上 + 右、右 + 下、左 + 下)都有效。我让一个朋友在他的电脑上运行代码,他发现除了上+右和右+下之外的所有方向都可以正常工作,但上+左对他来说效果很好。我们都查看了代码,但无法弄清楚。这可能是硬件问题吗?

基本上,这就是我正在做的事情:

import javax.swing.*;
import java.awt.event.*;

public class Test extends JFrame
{
    boolean up, down, left, right, fire;

    // Main constructor
    public Test()
    {
        // listeners for user input
        this.addKeyListener(new KeyAdapter()
        {
            public void keyPressed(KeyEvent e)
            {
                switch (e.getKeyCode())
                {
                    case KeyEvent.VK_UP:
                    {
                        up = true;
                        break;
                    }

                    case KeyEvent.VK_LEFT:
                    {
                        left = true;
                        break;
                    }

                    case KeyEvent.VK_RIGHT:
                    {
                        right = true;
                        break;
                    }

                    case KeyEvent.VK_DOWN:
                    {
                        down = true;
                        break;
                    }

                    case KeyEvent.VK_SPACE:
                    {
                        fire = true;
                        break;
                    }

                    case KeyEvent.VK_ESCAPE:
                    {
                        // Exit
                        System.exit(0);
                    }
                }
            }

            public void keyReleased(KeyEvent e)
            {
                // Upon releasing key, stop direction
                switch(e.getKeyCode())
                {
                    case KeyEvent.VK_UP:
                    {
                        up = false;
                        break;
                    }

                    case KeyEvent.VK_LEFT:
                    {
                        left = false;
                        break;
                    }

                    case KeyEvent.VK_RIGHT:
                    {
                        right = false;
                        break;
                    }

                    case KeyEvent.VK_DOWN:
                    {
                        down = false;
                        break;
                    }
                }
            }
        });
    }

    public static void main(String[] args)
    {
            // create frame
            Test test = new Test();
            test.setLocationRelativeTo(null);
            test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            test.setVisible(true);
            test.loop();
    }

    public void loop()
    {
        Timer timer = new Timer(250, new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                if (up)
                    System.out.println("Moving UP.");
                if (left)
                    System.out.println("Moving LEFT.");
                if (right)
                    System.out.println("Moving RIGHT.");
                if (down)
                    System.out.println("Moving DOWN.");
                if (fire)
                {
                    System.out.println("FIRING.");
                    fire = false;
                }
            }
        });

        timer.start();
    }
}

这个问题最初被问到here

【问题讨论】:

  • 您的操作系统或 JVM 版本是否也存在差异?哪个键在哪个操作系统中触发略有不同。最好的事情可能是查看正在触发的关键事件(如果有的话)并从那里开始。此外,像 Slick2D 这样的库可以帮助您抽象出这些奇怪的事件。

标签: java keylistener


【解决方案1】:

是的,它看起来像一个硬件限制。您可以尝试检查它在其他程序中的行为是否相同,如果是,则肯定是硬件问题。

键盘有这些限制,请参阅Rollover (key)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多