gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:07:14 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com