Cor*_*ida 2 java swing multithreading 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();
Run Code Online (Sandbox Code Playgroud)
你好,世界!我是java的新手,我正在使用netbeans所以我在我的jframe中有这个代码.我想要做的是在系统验证用户之后.它将删除所有字段的可见性并显示1000mills的"访问权限",但它会开始延迟,但仍然不会删除字段的可见性.
Thread.sleep就是这样,它会导致当前线程进入睡眠状态.在这种情况下,我假设它都是在事件调度线程的上下文中完成的,这意味着它无法更新屏幕,因为您已经停止处理新事件,例如重绘事件.
Swing是一个单线程环境,也就是说,对UI状态的所有交互和修改都应该在Event Dispatching Thread的上下文中发生.阻止此线程的任何内容,例如扩展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();
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请参阅Swing中的Concurrency和如何使用Swing Timers