由于 BufferStrategy 而未生成 KeyEvent

KeyEvent not getting generated due to BufferStrategy

所以我正在制作游戏,我的主要游戏应用程序 运行 没问题。问题是,当我尝试通过菜单启动我的游戏时(例如,使用按钮 ActionEvent),我的游戏似乎无法检测到提供给它的 KeyEvents。 所以我决定制作一个问题所在的代码的基本版本:

class Response
{
    static JFrame frame;
    static BufferStrategy strategy;
    public Response()
    {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setUndecorated(true);
        frame.setIgnoreRepaint(true);
        frame.addKeyListener(new KeyAdapter() {
        public void keyTyped(KeyEvent e)
        {
            System.exit(0);
        }
        });
        frame.setVisible(true);
        frame.createBufferStrategy(2);
        strategy = frame.getBufferStrategy();

        frame.requestFocus();
    }
    public static void mainLoop()
    {
        while(true)
        strategy.show();
    }
}

class Button implements ActionListener
{
    JFrame f;
    JButton b;
    public Button()
    {
        f = new JFrame();
        f.setExtendedState(JFrame.MAXIMIZED_BOTH);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        b = new JButton("Click lol");
        b.setFocusable(false);
        b.addActionListener(this);
        f.add(b);
        f.setVisible(true);
        f.setFocusable(false);
    }

    public void actionPerformed(ActionEvent e)
    {
        f.dispose();
        new Response();
        Response.mainLoop();
    }

    public static void main(String args[])
    {
        new Button();
    }
}

点击这里的按钮后,我得到了一个空白屏幕,正如预期的那样,但它没有检测到 KeyTyped 事件,并且在检查时,Response.frame 似乎没有焦点。

但是,如果我将 main() 的内容更改为 new Response(); Response.mainLoop();, 检测到 KeyEvent。

已调用 setFocusable() 方法,希望 Button 中的组件将焦点传递给 Response 框架。 (经过几个小时试图找到解决方案,我得出结论,使用 BufferStrategyJFrames 不能被关注(虽然我没有看到它明确地写在任何地方,所以请随时纠正我).

知道发生了什么吗?

提前致谢。

总的来说,焦点在java/swing中似乎是一件很滑的事情。我曾经历过,即使在调用了应该将焦点放在这些组件上的特定方法之后,组件也没有焦点。在调用 setFocusable() 之后,如果在任何 swing 组件上存在 setEnabled(),一旦应用程序 运行 并且据我所知,您应该能够通过单击该组件来设置焦点这是可以实现的最好的,并且可以保证工作。但是,永远不要依赖组件以您喜欢的方式传递焦点。这不太可能发生。