我在Java中有一段代码,它在屏幕上绘制了2个图标。我想在他们之间强制延迟,并且不确定最佳方式。
目前我有;
cell.setIcon(image1);
Thread.sleep(500); // Ignored try() for brevity
cell2.setIcon(image2);
但这似乎导致之前的延迟被绘制。为什么会这样,我该如何解决?
答案 0 :(得分:4)
假设您正在使用Swing,您需要在工作线程上执行睡眠,如下所示:
new SwingWorker<Void,Void>() {
@Override
protected Void doInBackground() throws Exception {
Thread.sleep(500);
return null;
}
@Override
protected void done() {
cell2.setIcon(image2);
}
}.execute();
答案 1 :(得分:2)
德文有最好的答案。至于原因,基本问题是setIcon函数不包含重新绘制组件的代码。流程如下:
1)点击GUI上的内容
2)生成事件,Swing调用所有听众
3)您的代码被触发并运行,setIcon被称为
4)您的代码完成运行并控制返回到Swing
5)摆动涂料任何新的/改变的组件等
所有这一切都发生在一个线程上。您希望在步骤3之后发生延迟,但是您不希望阻止当前线程,因为在延迟之后,步骤5将不会执行。 Devon的解决方案使用SwingWorker将延迟放在不同的线程上,因此不会阻止第5步。
答案 2 :(得分:1)
我会使用Swing Timer。当您显示第一个图标时,您启动计时器。当计时器触发时,显示第二个图标。
阅读How to Use Timers上的Swing教程中的部分以获取更多信息。