当前位置: 首页 > 面试题库 >

JFrame不在thread.sleep()之前更新

隆睿
2023-03-14
问题内容

我正在使用GUI和JFrames /
JPanels创建棋盘游戏,您可以在计算机上玩该游戏。我有一个名为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()是在事件分配线程上完成的,它将锁定GUI。

因此,如果您需要等待特定的时间,请不要在事件分发线程中休眠。而是使用
计时器

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


 类似资料:
  • 我一直在努力让我的JFrame重新绘制它的内容。在将新组件添加到JFrame中后,我尝试同时使用revaluate()和repaint()方法,但没有看到框架发生变化。 当用户单击前3个按钮中的任一个时,他们将进入以下代码块 当点击一个按钮时,整个应用程序变成白色,但我看不到我添加的新按钮。当我删除两个setVisible()方法行时,单击一个按钮肯定会删除组件,因为我现在不能单击其中任何一个,但

  • 我想做一个象棋游戏,我想在游戏循环中的一个jFrame上调用方法。这个特殊的JFrame显示了每个玩家的总击杀数。我很确定确实调用了repaint(),但由于某种原因,它似乎没有正确更新我的jlabel,jlabel应该保存每个玩家的击杀数值。 这是我为自定义JFrame扩展类编写的代码,该类包含代表kill的JLabel。 然后我只是在不同类的main方法中调用这个框架的repaint(): 非

  • 注意:如果我只有一个孩子,我可以删除它,没有任何例外,如果我有2个或更多的孩子,我有一个例外。 谢谢你的帮助!

  • 我正在使用swing,我无法在WindowBuilder中更改组件区域中的JFrame。我只能看到主框架。当我按下一个按钮时,我会创建一个新的框架,但我不能用WindowBuilder编辑它。

  • 问题内容: 下面显示的以下代码会将3个JLabel添加到JFrame中,然后删除3个JLabel。2秒后,它将重新绘制3个JLabel。 我面临的一个小问题是,它正在重新绘制到新的frame(frameTwo)而不是旧的frame(frameOne)。 如何使它重新绘制现有框架而不是重新绘制到新框架? 问题答案: Simpy使用CardLayout来交换视图。 请使用Swing计时器,而不要使用当

  • 我正在编写一个程序,其中包括创建一个JFrame,并使用Graphics类中的< code>drawOval()在其中绘制一个圆。我遇到了一个问题,我试图在JFrame的中心创建一个点,然后用这个点作为圆的x和y坐标来画圆。以下是我目前为止的代码: 正如您在函数中看到的,我将JFrame的大小设置为500x500。但是,当绘制圆圈时,当我期望它们在调用后基于时,它们的x和y坐标是(0,0)。我哪里