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
并启动它)工作得很好,也得到 KeyEvent
s。所以我们认为问题出在使用 CardLayout
的某个地方,但我们不知道它到底是什么。
感谢 D-Klotz 对输入映射问题的评论。尽管这不是我问题的正确解决方案,但它让我注意到了一些事情:
从 JFrame 切换到另一个 window 然后再返回时,KeyListener 再次正常工作。所以 actionPerformed
方法中唯一缺少的代码行是:
game.requestFocus();
很有魅力。再次感谢您的帮助。
我们想在我们的 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
并启动它)工作得很好,也得到 KeyEvent
s。所以我们认为问题出在使用 CardLayout
的某个地方,但我们不知道它到底是什么。
感谢 D-Klotz 对输入映射问题的评论。尽管这不是我问题的正确解决方案,但它让我注意到了一些事情:
从 JFrame 切换到另一个 window 然后再返回时,KeyListener 再次正常工作。所以 actionPerformed
方法中唯一缺少的代码行是:
game.requestFocus();
很有魅力。再次感谢您的帮助。