1

我有一个程序,一个游戏,带有用 Swing 制作的 GUI。

GUI 由我自己的类组成,它继承了 JFrame 并拥有一个带有 CardLayout 的 JPanel,它有多个 JPanel 作为卡片。

在其中一个面板上有一个开始游戏的按钮,游戏视图位于其中一张卡片上(视图对象具有自己的继承 JPanel 的类,在 JFrame 的构造函数中添加到卡片中) .

现在开场白:

我按下了 JButton,所以我跳转到 Event Dispatch Thread 执行 actionPerformed 方法。

在这种方法中,我首先翻转到包含视图面板的卡片,然后实例化我要玩的关卡和游戏引擎(根据关卡实例化)。然后我在视图对象上调用 repaint(最终应该在应用窗口中绘制游戏)然后我调用我的游戏引擎对象来启动游戏循环。

我的问题是:

当我按下按钮时,游戏引擎开始正常运行(我从控制台的打印中看到它),但我的 GUI 冻结并且不会刷新以显示游戏视图。当我删除启动游戏循环的代码片段时,游戏视图正常显示在屏幕上,但没有任何动作,因为游戏循环尚未启动。

所以我已经推断出,因为在 Java 中,一切都不会按照编写的顺序发生,游戏循环在 actionperformed 方法中的其他操作完成之前开始运行。

这是来自 actionperformed 方法的相关片段 kortti = card kentta = level valikkopaneeli = 具有卡片布局的面板 aloitusnappula = 开始游戏的按钮 Peli = 我创建的继承 JFrame 的类

if (e.getSource() == aloitusnappula) {

CardLayout kortti = (CardLayout)valikkopaneeli.getLayout(); 肯塔肯塔 = 新肯塔(“testikentta.txt”);kortti.show(valikkopaneeli,“贝利”);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 = 视图对象 peliLooppi() = 游戏引擎类中启动游戏循环的方法

如果我从 aloita 方法中删除 moottori.peliLooppi() 调用,游戏视图将正常显示。

我试图用谷歌搜索一些答案,而我得到的最远的方法是用 SwingWorker 做这件事,但不知何故,这听起来不像是做我想做的事的好方法。

有什么建议么?

4

2 回答 2

1

我想你在 edt 中启动你的引擎循环。如果是这样,那就不好了。

从 edt 调用另一个线程,并从这个新线程管理您的引擎。对于 gui 更新,请使用SwingUtilities.invokeLater调用 edt 。

或者最好使用SwingWorker

要阅读一些关于 Swing 中长期工作的优秀英文文档,请参阅Swing 中的并发。不要使用 Thread.sleep。

于 2011-01-11T22:07:00.533 回答
1

当我删除启动游戏循环的代码片段时,游戏视图正常显示在屏幕上

听起来您可能正在使用带有 Thread.sleep 的 while 循环。

更好的方法是使用Swing Timer来安排游戏的“循环”。

于 2011-01-11T22:37:03.233 回答