-1

我有一个JLabel我想暂时更改的,这是我为此编写的代码:

infoLabel.setText("Added");
try {
   TimeUnit.MILLISECONDS.sleep(300);
}
catch(InterruptedException ex)
{
}

infoLabel.setText("Action"); //funny part is when I comment this line it works

我的标签默认文本是“操作”

4

4 回答 4

3

Swing 是一个单线程框架,这意味着,如果您执行任何停止该线程的操作,那么它就无法响应任何新事件,包括绘制请求。

基本上,TimeUnit.MILLISECONDS.sleep(300)导致事件调度线程进入睡眠状态,阻止它处理任何新的绘制请求(除其他外)。

相反,您应该使用javax.swing.Timer

看一眼

更多细节

例如...

infoLabel.setText("Added");

Timer timer = new Timer(300, new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        infoLabel.setText("Action");
    }
});
timer.setRepeats(false);
timer.start();

请注意,300 毫秒是一个非常短的时间,您可能希望从一个稍大的值开始,例如 2000,即 2 秒;)

于 2013-10-28T02:20:03.657 回答
1

您正在睡眠 Swing 事件线程,使整个 GUI 进入睡眠状态。不要那样做。请改用摇摆计时器。

于 2013-10-28T02:20:06.677 回答
0

您的应用程序在单个线程上运行,因此当您休眠线程时,您会阻止它进行任何 GUI 更新。

于 2013-10-28T02:20:14.697 回答
0

你确定你做事正确吗?通过在 GUI 线程中做所有事情(包括睡眠),它总是很忙,永远不会回到 Java 以让 GUI 被重绘。

搜索 EDT(事件调度线程)以获取更多信息。这是关于该主题的一个问题:处理代码不起作用(线程、draw()、noLoop() 和 loop())

于 2013-10-28T02:21:13.617 回答