我有一个程序,一个游戏,带有用 Swing 制作的 GUI。
GUI 由我自己的类组成,该类继承 JFrame 并包含一个带有 CardLayout 的 JPanel,其中有多个 JPanel 作为卡片。
在其中一个面板上有一个启动游戏的按钮,游戏 View 位于其中一张卡片上( View 对象有自己的继承 JPanel 的类,在构造函数中添加到卡片中) JFrame)。
现在是序言:
我按下了 JButton,因此我跳转到事件调度线程来执行 actionPerformed 方法。
在这种方法中,我首先翻转到包含 View 面板的卡,然后实例化我要玩的关卡和游戏引擎(根据关卡实例化)。然后我在 View 对象上调用重绘(最终应该在应用程序窗口中绘制游戏),然后我调用我的游戏引擎对象来启动游戏循环。
我的问题是:
当我按下按钮时,游戏引擎开始正常运行(我从控制台中的打印中看到它),但我的 GUI 卡住并且不会刷新以显示游戏 View 。当我删除启动游戏循环的代码片段时,游戏 View 正常显示在屏幕上,但没有任何移动,因为游戏循环尚未启动。
所以我推断,因为在 Java 中,一切都不会按照编写的顺序发生,所以游戏循环在 actionperformed 方法中的其他操作完成之前就开始运行。
这是来自 actionperformed 方法的相关片段 kortti = 卡 肯塔 = 水平 valikkopaneeli = 有卡片布局的面板 aloitusnappula = 开始游戏的按钮 Peli = 我做的继承JFrame的类
if (e.getSource() == aloitusnappula) {
CardLayout kortti = (CardLayout)valikkopaneeli.getLayout(); Kentta kentta = new Kentta("testikentta.txt"); kortti.show(valikkopaneeli, "Peli"); Peli.this.pack(); Peli.this.setVisible(true); 阿洛伊塔(肯塔); }
这是 aloita(kentta) 方法的片段:
public void aloita(Kentta kentta) {
moottori = new Pelimoottori(Peli.this, kentta);
nakyma.repaint();
moottori.peliLooppi();
}
其中 Pelimoottori = 游戏引擎类 nakyma = View 对象 peliLooppi() = 游戏引擎类中启动游戏循环的方法
如果我从 aloita 方法中删除 moottori.peliLooppi() 调用,游戏 View 将正常显示。
我试图在谷歌上搜索一些答案,我得到的最远的是用 SwingWorker 来完成它,但不知怎的,这听起来不像是做我想做的事情的好方法。
有什么建议吗?
最佳答案
When i remove the snippet of code that starts the game loop, the game view shows on the screen normally
听起来您可能正在使用带有 Thread.sleep 的 while 循环。
更好的方法是使用 Swing Timer安排游戏的“循环”。
关于java - 如何在事件分派(dispatch)线程中等待任务完成然后继续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4663052/