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

GUI由我自己的类组成,该类继承JFrame并拥有一个具有CardLayout的JPanel,其中CardLayout具有多个JPanels作为卡片。

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

现在的序言:

我按下JButton,所以跳到事件调度线程以执行actionPerformed方法。

在这种方法中,我首先翻到装有查看面板的卡,然后实例化我要玩的级别和游戏引擎(根据级别实例化)。然后,我在视图对象上调用repaint(最终应在游戏在应用窗口中绘制游戏),然后调用游戏引擎对象以开始游戏循环。

我的问题是:

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

因此,我推断出这一点,因为在Java中,并不是所有事情都没有按照其编写的顺序发生,因此在执行actionperformed方法中的其他操作之前,游戏循环开始运行。

这是actionperformed方法的相关代码段
kortti =卡
kentta =水平
valikkopaneeli =具有卡片布局的面板
aloitusnappula =开始游戏的按钮
Peli =我制作的继承JFrame的类

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


CardLayout kortti =(CardLayout)valikkopaneeli.getLayout();
  Kentta kentta =新的Kentta(“ testikentta.txt”);
  kortti.show(valikkopaneeli,“佩利”);
  Peli.this.pack();
  Peli.this.setVisible(true);
  aloita(kentta);
    }

这是aloita(kentta)方法的一小段:

public void aloita(Kentta kentta) {
 moottori = new Pelimoottori(Peli.this, kentta);
 nakyma.repaint();
 moottori.peliLooppi();
}


其中Pelimoottori =游戏引擎类
nakyma =视图对象
peliLooppi()= Game Engine类中启动游戏循环的方法

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

我试着用谷歌搜索一些答案,而我得到的最遥远的结果是以某种方式使用SwingWorker来完成的,但是以某种方式听起来并不是我想要的一种好方法。

有什么建议么?

最佳答案

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


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

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

10-06 06:53