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

for-Java循环中的Thread.sleep(x)存在问题,java,graphics,Java,Graphics,我正在制作一个包含圆形矩形的框架。这个长方形一直在(重新)绘制 它本身具有较小的值 计划是,首先矩形的宽度(x)减小,然后矩形的高度(y)减小 但现在我只想让宽度减小。但我已经有麻烦了 请注意,我只画矩形的边框,所以我不想填充它 我做了一个for循环,如下所示: for (rectWidth = 470; rectWidth >= 0; --rectWidth) { try { //simply made to represent

我正在制作一个包含圆形矩形的框架。这个长方形一直在(重新)绘制 它本身具有较小的值

计划是,首先矩形的宽度(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”以使绘图不太快, 不会弄乱我的身体。这个线程。睡眠正在以一种我甚至看不见的方式扰乱我的框架 矩形不再是矩形了

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

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


解决方案是使用一个将在更新时运行并将任务发送到EventDispatchThread的线程。

也可以开始绘制线程

@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看起来更优雅,但我从未使用过它。

删除了我的帖子,因为它与Jim的没有什么不同。1+感谢Jim。谢谢各位,我会调查一下,让你们知道我做了什么来修复它。我不知道如何变得更“优雅”,但Swing计时器更容易使用,也更难搞乱,因为你们知道计时器ActionLister的actionPerformed方法中的任何内容都将在EDT上调用。Swing Timer使用一个背景线程来进行睡眠,所以机制与您的建议类似。是的,Swing Timer确实是一件非常好的事情,我已经尝试过了。但我用另一种方式解决了我的问题。我在构造函数中使用Thread.sleep创建了一个for循环,并将矩形的值设置为循环的“x”和“y”值。有一个重画();在我的油漆组件中,所以它现在工作正常。