Thread.sleep(长磨)也延迟了以前的方法

时间:2014-05-21 02:17:03

标签: java multithreading swing netbeans jframe

invalid_login_label.setVisible(false);
username_label.setVisible(false);
user_field.setVisible(false);
password_label.setVisible(false);
pass_field.setVisible(false);

access_granted_label.setVisible(true);
Thread.sleep(1000);
this.dispose();
你好世界!我是java的新手,我正在使用netbeans所以我在我的jframe中有这个代码。我想要做的是在系统验证用户之后。它将删除所有字段的可见性并显示1000mills的“访问权限”,但它会开始延迟,但仍然不会删除字段的可见性。

1 个答案:

答案 0 :(得分:5)

Thread.sleep就是这样,它会导致当前线程进入休眠状态。在这种情况下,我假设它都是在事件调度线程的上下文中完成的,这意味着它无法更新屏幕,因为您已经停止处理新事件,例如重绘事件。

Swing是一个单线程环境,也就是说,所有对UI状态的交互和修改都应该在事件调度线程的上下文中发生。阻止此线程的任何内容(例如扩展I / O,长时间运行的循环或Thread.sleep)都会阻止EDT处理新事件并更新屏幕,使您的应用程序看起来好像已冻结......

使用Swing Timer代替

例如......

invalid_login_label.setVisible(false);
username_label.setVisible(false);
user_field.setVisible(false);
password_label.setVisible(false);
pass_field.setVisible(false);

access_granted_label.setVisible(true);
javax.swing.Timer timer = new javax.swing.Timer(1000, new ActionListener() {
    public void actionListener(ActionEvent evt) {
        dispose();
    }
});
timer.setRepeats(false);
timer.start();

请查看Concurrency in SwingHow to Use Swing Timers了解详情