Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Swing中更新JLabel?_Java_User Interface_Swing_Timer - Fatal编程技术网

Java 如何在Swing中更新JLabel?

Java 如何在Swing中更新JLabel?,java,user-interface,swing,timer,Java,User Interface,Swing,Timer,我正在尝试使用Swing定时器,我想从一个非常简单的程序开始。我有一个窗口,上面有文字:“Youhaven seconds”,其中n每秒从10变为0 我知道如何生成包含文本的窗口。我知道定时器是如何工作的(它会定期启动一个动作)。但我不知道如何把这两件事结合起来。我是否应该使用:JLabel label=newjlabel(myMessage)然后我需要用定时器更新“myMessage”变量 但是我认为我需要“强制”我的窗口自身“更新”(以显示“myMessage”中存储的新值)。我建议您在每次

我正在尝试使用Swing定时器,我想从一个非常简单的程序开始。我有一个窗口,上面有文字:“Youhaven seconds”,其中n每秒从10变为0

我知道如何生成包含文本的窗口。我知道定时器是如何工作的(它会定期启动一个动作)。但我不知道如何把这两件事结合起来。我是否应该使用:
JLabel label=newjlabel(myMessage)然后我需要用定时器更新“myMessage”变量


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

我建议您在每次内容更新时调用
方法。然而,由于Swing的单线程特性,您必须在所谓的事件调度线程(EDT)中更新它的小部件。要做到这一点,请考虑调用<代码> SwitualUptudio.VooCelter < /C> >或<代码> SWIVITUTION.
这样,当由于调用setText而更改文本时,JLabel的事件将正确传播,标签将正确刷新。

Hi bro使用观察者模式。也就是说,您的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());
}

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

-1/2:),使用setText()是基本的,因此它实际上不值得+1,并且所有计时器代码都在EDT上执行,因此不必使用invokeLater()。这取决于您使用的计时器。如果您使用javax.swing.Timer,那么代码实际上是在EDT中运行的。然而,在最一般的情况下,人们倾向于使用java.util.Timer,它不会在EDT中运行,然后需要EDT同步代码,这确实是最难理解的部分。