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);
}
});
我正在制作一个每秒刷新一次的倒数计时器。
我一辈子都想不出如何使 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);
}
});