在类的方法中,我更新两次相同的标签。第一次,它显示要等待的用户消息,但第二次向用户显示已完成的消息。如下所示:
MyClass{
myMethod(){
jLabel.setText("Please wait...");
//does calculation
jLabel.setText("Completed successfully!");
}
}
当我运行应用程序时,我看到的只是“已成功完成”消息。 JLabel更新速度太快了吗?我该如何控制它?我尝试使用以下但没有运气:(
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
jLabel.setText("Please wait...");
}
});
答案 0 :(得分:6)
如果计算是在事件派发线程中完成的,那么它会阻塞线程并阻止它进行所有重新绘制。您必须在另一个线程中执行计算,并让此线程在结束时更改标签文本(在事件调度线程中,使用SwingUtilities.invokeLater或使用SwingWorker机制)。如果计算速度非常快,那么它是不值得的,因为第二个文本在第一个文本之后会很快出现,你甚至都不会注意到第一个文本。
查看专为此类用例设计的SwingWorker。 Its javadoc包含一个有用的示例。
答案 1 :(得分:3)
如果您想延迟一些操作/事件,请使用javax.swing.Timer,或将代码包装到Runnable#Thread
,
注意:永远不要在EDT中使用Thread.sleep(int)
,你的GUI会冻结,直到Thread.sleep(int)
结束
javax.swing.Timer
&的示例Runnable#Thread
&在EDT here
Freeze GUI
Thread.sleep(int)
答案 2 :(得分:-1)
可能是因为你的计算发生得太快了。你有没有尝试在计算结束后延迟。
同样正如Nizet在上面指出的那样,如果在EDT中发生这种情况,组件将不会重新绘制,直到线程结束,这意味着它将采用最后一个设置值。