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();
hello world !我有点新手java和我使用netbeans,所以我有这个代码在我的jframe。我想做的是在系统对用户进行身份验证之后。它将删除所有字段的可见性,并显示1000mills的"access granting",但是它开始延迟,但仍然没有删除字段的可见性。
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();
查看Swing中的并发性和如何使用Swing计时器了解更多细节