如何在不阻塞 UI 的情况下暂停 Java 指定时间? [复制]

Posted

技术标签:

【中文标题】如何在不阻塞 UI 的情况下暂停 Java 指定时间? [复制]【英文标题】:How to pause Java for a specified time without blocking UI? [duplicate] 【发布时间】:2018-06-05 01:29:57 【问题描述】:

我想这之前已经介绍过,但我没有找到真正解决我问题的答案。 在这段代码摘录中,我想显示对按钮单击的反应(在 lblMessage 中设置文本),等待一秒钟,然后显示另一张图像。

在标记为“等待 1000 毫秒”的部分中,我尝试了 Thread.sleep(),并计算了经过的系统时间。但是,在这两种情况下,lblMessage 仅在等待时间之后才填充。

我遇到了Timer,但我不知道如何使用它的语法(尤其是需要输入的任务)。

提前感谢您的帮助!

public void answerButtonClicked(ActionEvent event) 

    endTime = System.nanoTime();
    elapsedTime = (endTime - startTime);
    String answerTime = String.format("%.2f", (elapsedTime/1000000000));

    Button btnAnswer = (Button)event.getSource();
    String answer = btnAnswer.getId();      
    String correctAnswer = mpScenes.get(model.getNextScene(round-1));

    if (answer.equals(correctAnswer)) 
        lblMessage.setText("Richtig (" + answerTime + "s)");
     else 
        lblMessage.setText("Falsch (" + answerTime + "s)");
    

    **--<wait 1000 ms>--**

    if (round < numberOfRounds) 
        round++;
        setNewMainImage(round);
     else 
        endOfGame();
    

【问题讨论】:

【参考方案1】:

将您的 **--&lt;wait 1000 ms&gt;--** 替换为以下内容:

Timer timer = new Timer(1000, new ActionListener() 
    public void actionPerformed(ActionEvent e) 
        if (round < numberOfRounds) 
            round++;
            setNewMainImage(round);
         else 
            endOfGame();
        

    
);

timer.start();

javax.swing.Timer 允许您延迟一些稍后将在 swing UI 调度线程中执行的操作。

【讨论】:

非常感谢,这行得通!

以上是关于如何在不阻塞 UI 的情况下暂停 Java 指定时间? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在不阻塞 UI 的情况下创建 UIView

在不阻塞 UI 执行的情况下等待几秒钟

如何在不阻塞 UI 的情况下正确使用 MagicalRecord 从 Web 服务导入数据

Flutter:如何在不阻塞 UI 的情况下异步地从资产中读取文件

Java 执行器:当任务完成时,如何在不阻塞的情况下得到通知?

如何使用 ROOM 库在不阻塞 UI 的情况下将数千条记录从本地数据库加载到 recyclerview