我正在构建一个Reversi程序,我需要在每个图像开关之间延迟程序0.5秒(从黑色到白色,在Eat函数中),问题是使用Threads不起作用,它会弄乱变量和我得到了错误的结果。我需要一些wat来延迟程序而不使用线程。如果你需要它,这是函数。
public void func1(int turn)
{
int i,k;
for(i=0;i<8;i++)
for(k=0;k<8;k++)
{
if(eat[i][k]==turn)
{
board[i][k]=turn;
if(turn==1)
squares[i][k].setIcon(new ImageIcon("blkimg.PNG"));
else
squares[i][k].setIcon(new ImageIcon("whtimg.PNG"));
}
}
}
非常感谢。
答案 0 :(得分:2)
这看起来像是一个Swing应用程序(你永远不会说,这是非常的重要信息。如果是这样,只需使用Swing Timer来创建延迟。另外,不要继续读取图像文件。只读一次,创建图像图标一次,也许在类构造函数中,并将ImageIcons保存到变量或数组或集合中。
答案 1 :(得分:1)
您不需要广泛的线程知识就可以使用Thread.sleep()
让当前线程处于休眠状态 - 我建议您查看http://docs.oracle.com/javase/tutorial/essential/concurrency/sleep.html
答案 2 :(得分:1)
如果我是对的,那么这是一个常见问题。
使用Thread.sleep()
可能会导致Swing使用的同一个线程中的延迟更改接口(这通常显示在界面中没有反应,然后立即显示所有更改)。
您可以在Java教程中阅读有关Concurrency in Swing的更多信息。
解决方案可能是使用SwingWorker类,几个月前我为朋友创建了一个小样本。它是available in GitHub。如果您不使用Netbeans,请查看this class(第90-98行和第151-165行)。
编辑:调整以反映这只是一种可能的解决方案。正如其他人所指出的,至少有另一个好的选择。
答案 3 :(得分:-1)
我错过了什么吗?为什么不能只使用Thread.sleep()将当前线程置于休眠状态?
回应评论中的讨论:
你需要掌握gui线程的想法。如果所有代码都在gui线程上执行,那么GUI就不会“随时”重绘。快速而肮脏的解决方法是根据需要进行必要的调用以强制重绘。