使用java使用计时器交替显示图像

时间:2011-03-03 10:37:08

标签: java image loops timer alternate

由于我不是CS专业,我在将编程愿望转化为实际课程时遇到了一些困难。 它基本归结为以下内容:如何在标签上交替显示图像,为每个图像显示特定时间的图像。

所以:说我有图像A和B;我希望用户看到A为1000ms,B为200ms。这将一直循环,直到用户按下某个键。

现在,我可以非常轻松地将图像加载到面板上,并且我已经设法使用KeyListener和东西捕获用户输入,这些都非常好用,并且比我预期的要容易得多。我也知道如何使用循环结构,如while,for和do..while,但这个计时器业务是阴暗的。

我看到各种使用线程的东西,什么不是,我真的不需要它。这不是关于有效的编程或良好的代码,它只是关于展示某些东西。 任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:0)

这可能是一个很好的例子: http://www.java2s.com/Code/Java/Development-Class/UsejavautilTimertoscheduleatasktoexecuteonce5secondshavepassed.htm

如果代码看起来令人困惑,我可以尝试解释代码

答案 1 :(得分:0)

当线程是正确的工具时,使用线程没有任何效率。

在这种情况下,创建一个实现Runnable的新类是不合理的,该类包含对您希望更改图像的标签的引用。

这意味着可以更改图像,而不会导致主应用程序等待,直到完成为止。

您可能希望避免'Busy Loops'[基本上是一个没有Thread.sleep()的while循环],并查看是否有任何需要的线程退出条件

答案 2 :(得分:0)

使用SwingWorker<Void, Void>。 SwingWorker的doInBackground方法应如下所示:

@Override
protected Void doInBackground() {
    try {
        while (true) {
            displayImage(imageA);
            Thread.sleep(1000L);
            if (isCancelled()) {
                return null;
            }
            displayImage(imageB);
            Thread.sleep(200L);
            if (isCancelled()) {
                return null;
            }
        }
    }
    catch (InterruptedException e) {
        // ignore
    }
    return null;
}

private void displayImage(final Icon image) {
    SwingUtilituies.invokeLater(new Runnable() {
        @Override
        public void run() {
            // display the image in the panel
        }
    });
}

keylistener应该只是取消SwingWorker。