我有一个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
标签的默认文本是"操作"
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 秒;)
您正在使 Swing 事件线程进入睡眠状态,使整个 GUI 进入睡眠状态。别这样。请改用摆动计时器。
您的应用程序在单个线程上运行,因此当您休眠线程时,会阻止它进行任何 GUI 更新。
你确定你做事正确吗?通过在 GUI 线程中执行所有操作(包括睡眠),它将始终处于繁忙状态,并且永远不会返回到 Java 以便重新绘制 GUI。
搜索 EDT(事件调度线程)以获取详细信息。 这里有一个关于这个主题的问题:处理代码不起作用(Threads,draw(),noLoop()和loop())