Java - Swing JLabel更新速度太快了?

时间:2011-11-28 21:30:25

标签: java multithreading swing jlabel

在类的方法中,我更新两次相同的标签。第一次,它显示要等待的用户消息,但第二次向用户显示已完成的消息。如下所示:

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...");
            }
        });

3 个答案:

答案 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中发生这种情况,组件将不会重新绘制,直到线程结束,这意味着它将采用最后一个设置值。