2014-11-01 58 views
0
public class TestFrame extends JFrame 
{ 
    public TestFrame() 
    { 

     setBounds(10, 10, 500, 500); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(3);  
    } 

    public static void main(String[] args) throws InterruptedException 
    { 
     TestFrame tf = new TestFrame(); 
     tf.add(new JButton("test1")); 
     tf.setVisible(true); 
     Thread.sleep(2000); 
     tf.getContentPane().removeAll(); 
     tf.add(new JButton("test2")); 
     System.out.print("Show test"); 
    } 
} 

我希望節目在2秒後顯示JButton("test2")
然後我在test1之後加thread.sleep(2000)在鞦韆上使用睡眠()

但我不知道爲什麼程序停止在顯示test1 JButton, 沒有顯示test2 JButton和「顯示測試」消息可以sucess打印出來

+0

這類問題在一週內被問及(並解決了好幾次)。您是否嘗試過首先搜索解決方案? – Tom 2014-11-01 10:22:07

回答

5

簡短的回答,沒有。

Swing是一個單線程框架,這意味着阻塞事件分派線程的任何事情都將阻止它更新UI或處理任何新事件(使您的UI看起來像掛起,導致它已經)。

當然,您可以使用Thread,但Swing也不是線程安全的。這意味着對UI的所有修改必須在事件分派線程的上下文中進行。雖然有辦法解決這個問題,但最簡單的方法是簡單地使用Swing Timer

採取在How to use Swing TimersConcurrency in Swing細看了解更多詳情

你也應該看看Initial Threads

更新UI時,可能需要在添加新組件以強制UI更新以重新佈置其內容之後調用revaldiaterepaint

+0

感謝您的幫助 – YWX 2014-11-01 11:52:47

+0

很高興幫助... – MadProgrammer 2014-11-01 11:53:54