我正在制作一个包含圆角矩形的框架。这个矩形经常(重新)绘画 本身价值较小。
计划是,首先矩形的宽度(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以我甚至看不到的方式弄乱了我的框架 这个矩形了。
我想实现矩形的平滑(重新)绘画。 (是的,我知道现在是这段代码 它不是重新绘制矩形,而是在框架中不断地绘制一个稍小的矩形。)
答案 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看起来更优雅,但我从未使用它。