Thread.sleep() 在其他语句之前暂停 JFrame

Thread.sleep() pauses JFrame before other statements

Thread.sleep() 总是在 sleep() 语句执行之前暂停 JFrame。 我有以下暂停线程的方法:

private void sleep(int milli)   {
    try {
        Thread.sleep(milli);
    }   catch   (InterruptedException ex)   {
        writeToConsoleError("Interrupted");
    }
}

我在 case CARDNOMATCH: 下的以下 switch-case 语句中调用它:,此方法位于扩展 JFrame 的 class 中。

public void handlePacket(Packet recieved)   {
    int cmd = recieved.getCommand();
    int arg1 = -99;
    int arg2 = -99;
    switch (cmd)    {
        case CARDNOMATCH:
            arg1 = recieved.getFirstArg();
            arg2 = recieved.getSecondArg();
            if(arg1 > 9)    {
                arg1 = 9;
            }
            if(arg2 > 9)    {
                arg2 = 9;
            }
            flipCard(choice1, arg1);
            flipCard(choice2, arg2);
            sleep(3000);
            flipCard(choice1, 10);
            flipCard(choice2, 10);
            break;
        case ENABLE_TURN:
            this.isTurn = true;
            break;
        case DISABLE_TURN:
            this.isTurn = false;
            break;
    }
}

请任何人给我一些见解:(

UI 不是即时更新的。

当你打电话时

flipCard(choice1, arg1);
flipCard(choice2, arg2);

我假设 flipCard 以某种方式更新了 UI。而您预期的行为是 choice1choice2 卡片将被翻转,等待 3 秒,然后再次翻转它们。但是你得到的实际行为是在 3 秒过去之前什么都没有发生,3 秒后,卡片翻转了两次。

你需要了解的是UI有一个帧率。当你调用flipCard时,直到下一帧才会翻牌。在这一帧和下一帧之间的时间里,Thread.sleep 被调用,所以所有的东西,包括帧,暂停 3 秒。这就是 UI 在暂停 3 秒后更新的原因。

我建议您使用 javax.swing.Timerjavax.swing.SwingWorker。有关详细信息,请参阅 here or here