延迟java程序

时间:2012-03-27 01:24:21

标签: java swing delay

我正在构建一个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"));
    }
    }
}

非常感谢。

4 个答案:

答案 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就不会“随时”重绘。快速而肮脏的解决方法是根据需要进行必要的调用以强制重绘。