JLabel在不需要额外线程的情况下不刷新?

时间:2015-01-23 06:24:10

标签: java swing jlabel event-dispatch-thread actionevent

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

我无法弄清楚如何让JLabel刷新。我已经搜索了其他线程,但它们都涉及使用其他线程。有没有办法让JLabel / Panel刷新? (小组可能是不必要的)。它可以工作,如果我删除while循环,这将只给我一个原始时间的计时器的字符串,没有减少。但是如果我包含while循环,它只返回一个恒定的空白屏幕,直到计时器用完,然后它返回到原始值。

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

1 个答案:

答案 0 :(得分:3)

  

“如果我删除了while循环

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

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);
    }
});