我有一个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
我的标签默认文本是“操作”
我有一个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(事件调度线程)以获取更多信息。这是关于该主题的一个问题:处理代码不起作用(线程、draw()、noLoop() 和 loop())