我有一个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
标签的默认文字是“行动”
答案 0 :(得分: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秒;)
答案 1 :(得分:1)
你正在睡觉Swing事件线程,让整个GUI进入休眠状态。不要那样做。改为使用Swing Timer。
答案 2 :(得分:0)
您的应用程序在单个线程上运行,因此当您在线程中休眠时,可以防止它进行任何GUI更新。
答案 3 :(得分:0)
你确定你做得对吗?通过在GUI线程中执行所有操作(包括休眠),它将始终处于忙碌状态,并且永远不会回到Java以便重新绘制GUI。
搜索EDT(事件派发线程)以获取更多信息。以下是关于此主题的一个问题:Processing code doesn't work (Threads, draw(), noLoop(), and loop())