JLabel 不需要额外的线程就不会刷新吗?

JLabel not refreshing without needing additional threads?

我正在制作一个每秒刷新一次的倒数计时器。

我一辈子都想不出如何使 JLabel 刷新。我搜索了其他线程,但它们都涉及使用额外的线程。有没有办法使 JLabel/Panel 刷新? (可能不需要面板)。如果我删除 while 循环,它会起作用,这只会在原始时间给我一个静止的计时器字符串,没有递减。但是,如果我包含 while 循环,它只是 returns 一个持续的空白屏幕,直到计时器用完,然后它返回到原始值。

我应该如何刷新 JLabel 以便它在每次递减时都显示在 GUI 上(希望不使用线程..)? (或者每次 while 循环运行时)

"It works if I remove the while loop"

您正在阻塞事件调度线程。

Swing 是一个单线程框架,这意味着 EDT 将阻止任何块处理事件队列并导致 UI 挂起。

有关详细信息,请参阅 Concurrency in Swing

最简单的解决方案是使用 Swing Timer,这将允许您安排一个定期回调,该回调将在 EDT 的上下文中执行。

有关详细信息,请参阅 How to use Swing Timers

javax.swing.Timer timer = new javax.swing.Timer(500, new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        counter++;
        label.setText(count);
    }
});