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