我有一个程序,一个游戏,带有用 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 做这件事,但不知何故,这听起来不像是做我想做的事的好方法。
有什么建议么?