for循环中Thread.sleep(x)的问题 - Java

时间:2011-03-29 21:09:29

标签: java graphics

我正在制作一个包含圆角矩形的框架。这个矩形经常(重新)绘画 本身价值较小。

计划是,首先矩形的宽度(x)减小,之后矩形的高度(y)减小。

但是现在我只想让宽度减小。但我已经在这里遇到麻烦了。

请注意,我只是绘制矩形的边框,所以我不想填充它。

我按如下方式制作了一个for循环:

 for (rectWidth = 470; rectWidth >= 0; --rectWidth) {

           try {
                //simply made to represent rectWidth's value, not really relevant
                System.out.println("rectWidth is: " + rectWidth);

                //draw the rectangle with it's new width, ignore the "rectHeight" for now.
                g.drawRoundRect(5, 5, rectWidth, rectHeight, 10, 10);

                //this Thread.sleep is messing up my frame which has an instance of this class added 
                //to it also, my program is uninterruptable when adding this Thread.sleep
                Thread.sleep(500);

            } catch (Exception ex) {
                //rectangle's value will be returned here when interrupted.

          }
         }

我的问题是,如何在for循环中添加'sleep'以使绘图不会太快, 没有搞乱我的框架。这个thread.sleep以我甚至看不到的方式弄乱了我的框架 这个矩形了。

我想实现矩形的平滑(重新)绘画。 (是的,我知道现在是这段代码 它不是重新绘制矩形,而是在框架中不断地绘制一个稍小的矩形。)

2 个答案:

答案 0 :(得分:5)

未显示矩形的原因是显示在EventDispatchThread上更新,这可能与您的循环所在的相同。也就是说它不能绘制矩形,因为它太忙了睡觉。

解决方案是使用Swing Timer运行,并在更新时愉快地将任务发送到EventDispatchThread。

答案 1 :(得分:0)

您也可以开始绘制线程

@Override
public void run(){
  while(shouldDraw())
  this.wait(500);

  yourCalculations(); // maybe setting fields in runnable object

  SwingUtilities.invokeAndWait(yourRunnableObject); // or invokeLater if you prefer non blocking version
  }

此代码仅显示概念(我已跳过同步和异常处理)。 SwingTimer看起来更优雅,但我从未使用它。