我有一个程序,一个游戏,带有用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安排游戏的“循环”。