當我開始我的Swing對話框佈局它有所作爲是否我做在類的run方法:Swing對話框佈局:運行方法或構造函數?
public void run() { frame = new JFrame(); ... frame.setVisible(true); }
或類的構造函數?
public MyClass { frame = new JFrame(); ... frame.setVisible(true); } public void run() { }
感謝
當我開始我的Swing對話框佈局它有所作爲是否我做在類的run方法:Swing對話框佈局:運行方法或構造函數?
public void run() { frame = new JFrame(); ... frame.setVisible(true); }
或類的構造函數?
public MyClass { frame = new JFrame(); ... frame.setVisible(true); } public void run() { }
感謝
是的確很重要,原因是,你應該調用最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()
方法。
這是上下文。正如@ hovercraftfullofeels指出的那樣,您需要確保所有的UI代碼都在EDT
中執行,包括初始化。
如果您已經在EDT
中運行,那麼應該沒有必要使用InvokeLater
(除非您真的想),否則您必須將呼叫重新同步回EDT
。
最好檢查EventQueue.isDispatchingThread
好了。 1+加註 – 2012-07-25 20:51:36
謝謝你們兩位。 – 2012-07-27 23:33:50