2014-05-21 21 views
2
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的「授予訪問權限」,但它會開始延遲,但仍不會刪除字段的可見性。Thread.sleep(長磨)延遲也是以前的方法

+1

谷歌'的Java Swing Thread.sleep'。 –

回答

5

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(); 

看看Concurrency in SwingHow to Use Swing Timers更多細節