java - Thread.sleep(long mills) 也延迟了以前的方法

标签 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 的“已授予访问权限”,但它开始延迟,但仍然不会删除字段的可见性。

最佳答案

Thread.sleep 就是这样做的,它导致当前线程 hibernate 。在这种情况下,我假设这一切都是在事件调度线程的上下文中完成的,这意味着它无法更新屏幕,因为您已阻止它处理新事件,例如重绘事件。

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

改用 Swing 计时器

例如...

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了解更多详情

关于java - Thread.sleep(long mills) 也延迟了以前的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23772951/

相关文章:

java - IntelliJ IDEA 中的Processing.org 小程序

java - 调用 LinkedHashMap 的 put() 方法后如何更新 'before' 和 'after' 变量?

Neo4j 不支持 Java 运行时。使用 JDK 6.ubuntu 12.04

java - 为什么我的 JTextField 没有被填充

Java Swing 第二个 JFrame 布局填充空间?

java - XMLReader 搜索相对于主应用程序的 DTD 文件而不是 XML 文件

c# - 异步任务未在后台运行?

c# - 中止阻塞线程的正确方法

c++ - 从 QThread 返回 QSqlQuery 结果

Java调整图像的中心