1

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

所以:假设我有图像 A 和 B;我希望用户在 1000 毫秒内看到 A,在 200 毫秒内看到 B。这会一直循环,直到用户按下某个键。

现在,我能够将图像加载到面板上,甚至非常容易,并且我已经设法使用 KeyListener 和其他东西来捕捉用户输入,这一切都非常好,而且比我预期的要容易得多。我也知道如何使用循环结构,如 while、for 和 do..while,但这个计时器业务是阴暗的。

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

4

3 回答 3

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。

于 2011-03-03T10:50:51.567 回答
0

当线程是工作的正确工具时,使用线程没有什么必然低效的。

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

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

您可能希望避免“繁忙循环”[基本上是一个没有 Thread.sleep() 的 while 循环],并查看是否有任何需要的线程退出标准

于 2011-03-03T10:49:08.733 回答
0

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

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

于 2011-03-03T10:44:41.763 回答