在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教程 。