java - 如何在事件分派(dispatch)线程中等待任务完成然后继续?

标签 java events swing swingworker

我有一个程序,一个游戏,带有用 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/

相关文章:

java - 嘿,我刚刚开始在 android 中编码并收到错误 Permission Denial : not allowed to send broadcast in android

java - 恩弗斯 : wrong audit table on a Spring MVC project

c# - 有人知道为什么我无法在 C# 中以编程方式访问 winevt 文件夹吗?

events - Firebase 分析。无法向事件添加自定义参数

events - 当用户离开(或被移除)团队时,与 team_join 等效的 slack 事件是什么

java - 如何在多个Spring Boot存储库实例之间切换

java - 非静态变量 this 不能从静态上下文 JFrame 中引用

java - JTabbedPane 问题 : how to find and track existing JTabbedPane's tab

java - 如何高效地完全展开一个大的JTree

java - 组织项目库