Java Swing 2D 游戏 - EventQueue 在 CardLayout 切换后停止触发

Java Swing 2D Game - EventQueue stops firing after CardLayout switch

我们想在我们的 2D 游戏中添加一个菜单。

到目前为止,我们的游戏循环 运行 在主线程上运行,而 Swing 的 EventQueue 正在处理游戏的关键输入。现在因为我们想要添加菜单,我们不能再简单地从我们的 main 方法启动游戏循环。

问题:我们不知道如何以 EventQueue 不断接收 KeyEvent 的方式启动游戏循环。

这是我们的菜单:

startGameButton.addActionListener(new ActionListener() {

    @Override
        public void actionPerformed(ActionEvent e) {
            CardLayout cl = (CardLayout)Menu.this.getParent().getLayout();
            cl.show(Menu.this.getParent(), "Game");
        }
    });

因此单击 startGameButton 会从 JFrame 中删除菜单并显示游戏本身,但游戏已冻结,因为我们不再从主线程启动游戏循环。我们认为它就在这里,我们需要开始游戏循环。

所以我们创建了一个新的 Thread,它将 运行 我们的游戏循环以防止冻结我们的 UI:

startGameButton.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            CardLayout cl = (CardLayout)Menu.this.getParent().getLayout();
            cl.show(Menu.this.getParent(), "Game");

            Thread gameThread = new Thread(new Runnable() {

                @Override
                public void run() {
                    while (true) {
                        game.update();
                        game.repaint();
                        Thread.sleep(10);
                    }
                }
            });
            gameThread.start();
        }
    });

这很完美,游戏出现了,而且 运行ning...但是:我们的 KeyEvent 不再开火了。 EventQueue 不知何故不再拾取击键,我们不知道为什么。

在不使用 CardLayout 菜单的情况下,在主方法中使用完全相同的代码(创建 Thread 并启动它)工作得很好,也得到 KeyEvents。所以我们认为问题出在使用 CardLayout 的某个地方,但我们不知道它到底是什么。

感谢 D-Klotz 对输入映射问题的评论。尽管这不是我问题的正确解决方案,但它让我注意到了一些事情:

从 JFrame 切换到另一个 window 然后再返回时,KeyListener 再次正常工作。所以 actionPerformed 方法中唯一缺少的代码行是:

game.requestFocus();

很有魅力。再次感谢您的帮助。