我想知道为什么Thread.sleep()在预期的时间点不起作用。

我希望先绘制第一个矩形,先停顿2秒,然后再绘制第二个矩形。
但是,首先会暂停,然后“立即”绘制两个矩形。

为什么会发生这种情况?

在此先感谢您的任何建议。

public class Figure extends JPanel

{

  Point a = new Point(10, 10);

  Point b = new Point(110, 10);

  Point c = new Point(110, 110);

  Point d = new Point(10, 110);

  @Override
  protected void paintComponent(Graphics g)
  {

    super.paintComponent(g);

    g.drawLine(a.x, a.y, b.x, b.y);

    g.drawLine(b.x, b.y, c.x, c.y);

    g.drawLine(c.x, c.y, d.x, d.y);

    g.drawLine(d.x, d.y, a.x, a.y);

    try
    {
      Thread.sleep(2000);
    }
    catch(InterruptedException ex)
    {
    }
    Point newA = rotate(a, 45);
    Point newB = rotate(b, 45);
    Point newC = rotate(c, 45);
    Point newD = rotate(d, 45);

    g.drawLine(newA.x, newA.y, newB.x, newB.y);
    g.drawLine(newB.x, newB.y, newC.x, newC.y);
    g.drawLine(newC.x, newC.y, newD.x, newD.y);
    g.drawLine(newD.x, newD.y, newA.x, newA.y);
  }

  private Point rotate(Point p, int degree)

  {

    //to shift the resulting Point some levels lower
    int offset = 100;

    int x = (int)(Math.cos(degree) * p.x + Math.sin(degree) * p.y);
    int y = (int)(-Math.sin(degree) * p.x + Math.cos(degree) * p.y) + offset;

    Point ret = new Point(x, y);
    return ret;
  }

}

最佳答案

发生这种情况是因为您没有进入Swings事件循环。只有这样,才能保证执行绘画命令。同样,这也是为什么永远不要在事件循环线程中睡觉的好主意的原因之一...

08-26 11:50