在thread.sleep()之前JFrame没有更新

我正在使用GUI和JFrames / JPanel创建一个棋盘游戏,您可以在其中与计算机对战。 我有一个名为showPieces()的方法,它通过更改按钮数组(以网格格式布局)上的图像图标来更新电路板GUI。 更新图标后,使用revalidate()repaint()方法更新GUI。 showPieces()方法有一个参数,每次调用时都需要传递给它。

我遇到的主要问题是我希望人类进行移动,更新GUI,等待1秒钟,计算机使其移动然后循环直到有人获胜。 我的基本代码如下:

 do{ human.makeMove(); gui.showPieces(data); try { Thread.sleep(1000); } catch(InterruptedException ex) { Thread.currentThread().interrupt(); } computer.makeMove() gui.showPieces(data); }while(playing); 

这导致了这样的问题:当人类玩家进行移动时,GUI将冻结一秒钟,然后在延迟之后,两个动作同时进行。

我希望它有意义,但我是Java的新手,可能不得不更多地考虑线程,因为我不太了解它。

Thread.sleep()在Event Dispatch Thread上完成,它将锁定GUI。

因此,如果您需要等待特定的时间,请不要在事件调度线程中hibernate。 相反,使用计时器

  int delay = 1000; //milliseconds ActionListener taskPerformer = new ActionListener() { public void actionPerformed(ActionEvent evt) { //...Perform a task... } }; new Timer(delay, taskPerformer).start(); 

与大多数类似的Swing问题一样,您通过在GUI的事件线程(EDT或事件调度线程)上调用Thread.sleep(...)来使整个Swing GUI处于hibernate状态,并且在此期间GUI将会无法更新其图像或与用户进行任何交互。 这里的解决方案不是使用Thread.sleep(...)而是使用Swing Timer来引起1秒的延迟。

Swing Timer教程 。