如何在Swing中更新JLabel?

4

我想使用Swing Timer,希望从一个非常简单的程序开始。 我有一个窗口,上面显示着文本:“您有n秒”的信息,其中n每秒钟会从10变为0。

我知道如何生成一个带有文本的窗口。 我也理解Timer的工作原理(周期性地触发一个动作)。 但是我无法想象如何将这两个东西结合起来。我应该使用以下代码:JLabel label = new JLabel(myMessage); 然后使用计时器更新“myMessage”变量吗?

但我认为我需要“强制”窗口“更新”自己(以显示存储在“myMessage”中的新值)。

2个回答

7
我建议每次更新内容时调用JLabel#setText方法。然而,由于Swing非常单线程的特性,您必须在所谓的事件分派线程(EDT)中更新其小部件。要这样做,请考虑在计时器代码中调用SwingUtilities.invokeLaterSwingUtilities.invokeAndWait
这样,当由于您调用setText而更改文本时,JLabel的事件将正确传播,并且标签将被正确刷新。

-1/2 :),使用setText()是基本操作,所以不值得+1,所有计时器代码都在EDT上执行,因此不必使用invokeLater()。 - camickr
1
这取决于您使用的计时器。如果您使用javax.swing.Timer,则确实在EDT中运行代码。但是,在大多数情况下,人们倾向于使用java.util.Timer,它不会在EDT中运行,因此需要EDT同步代码,这确实是最难理解的部分。 - Riduidel

5

嗨兄弟,使用观察者模式。也就是说,你的UI类应该是你的计时器结构的监听器。当你的变量改变时,调用你的计时器的监听器,即你的UI类。

//your observer class 

update(Object obj){

label.setText(obj.toString());
}
...

//your observable class
//when timer changes varible's value  you should call invokeListeners() 


invokeListener(){

for(Listener listener :listeners)
listener.update(getSecond());
}

我不知道你的类和结构。但是我在我的一个作业中使用了这个解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接