在Java中绘制两个图标之间的延迟

时间:2009-12-07 16:30:45

标签: java swing

我在Java中有一段代码,它在屏幕上绘制了2个图标。我想在他们之间强制延迟,并且不确定最佳方式。

目前我有;

cell.setIcon(image1);
Thread.sleep(500); // Ignored try() for brevity
cell2.setIcon(image2);

但这似乎导致之前的延迟被绘制。为什么会这样,我该如何解决?

3 个答案:

答案 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教程中的部分以获取更多信息。