2012-07-25 21 views
1

當我開始我的Swing對話框佈局它有所作爲是否我做在類的run方法:Swing對話框佈局:運行方法或構造函數?

 

    public void run() 
    { 
     frame = new JFrame(); 
     ... 
     frame.setVisible(true); 
    } 

或類的構造函數?

 

    public MyClass 
    { 
     frame = new JFrame(); 
     ... 
     frame.setVisible(true); 
    } 
    public void run() 
    { 
    } 

感謝

回答

4

是的確很重要,原因是,你應該調用最Swing代碼,包括創建你的JFrame的,Swing事件線程(事件指派線程或EDT)上。要做到這一點,你通常在一個Runnable創建Swing GUI的,並通過調用像排隊事件線程上了Runnable:

SwingUtilities.invokeLater(new Runnable(){ 
    public void run() { 
    // create your Swing GUI here 
    frame = new JFrame(); 
    ... 
    frame.setVisible(true); 
    } 
}); 

例外情況是在API中記錄的Swing方法調用是thread-安全,如組件的repaint()方法。

3

這是上下文。正如@ hovercraftfullofeels指出的那樣,您需要確保所有的UI代碼都在EDT中執行,包括初始化。

如果您已經在EDT中運行,那麼應該沒有必要使用InvokeLater(除非您真的想),否則您必須將呼叫重新同步回EDT

最好檢查EventQueue.isDispatchingThread

+0

好了。 1+加註 – 2012-07-25 20:51:36

+0

謝謝你們兩位。 – 2012-07-27 23:33:50