由于我不是CS专业,我在将编程愿望转化为实际课程时遇到了一些困难。 它基本归结为以下内容:如何在标签上交替显示图像,为每个图像显示特定时间的图像。
所以:说我有图像A和B;我希望用户看到A为1000ms,B为200ms。这将一直循环,直到用户按下某个键。
现在,我可以非常轻松地将图像加载到面板上,并且我已经设法使用KeyListener和东西捕获用户输入,这些都非常好用,并且比我预期的要容易得多。我也知道如何使用循环结构,如while,for和do..while,但这个计时器业务是阴暗的。
我看到各种使用线程的东西,什么不是,我真的不需要它。这不是关于有效的编程或良好的代码,它只是关于展示某些东西。 任何帮助将不胜感激!
答案 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。