我有一些初始化代碼需要在Java Swing應用程序啓動時運行,而沒有任何事件被觸發。在Java Swing中初始化代碼的最佳實踐
我的初始化代碼位於myInits()
函數中。 myInits()
做各種事情:從文件讀取配置,設置背景和一些標籤,產生網絡線程,初始化變量。
從谷歌搜索和我自己的知識,我已經找到了不同的方式來實現這一目標(請糾正我,如果任何下文所述的假設是錯誤的):
- 運行
myInits()
在觸發事件Window_Opened
。
這確保GUI被繪製並且myInits()
可以訪問任何組件並進行更改。不幸的是,我不能使用這種方法,因爲我的應用程序開始隱藏,並且不會觸發Window_Opened
。
將
myInits()
的JFrame
構造函數中:public class MyFrame extends javax.swing.JFrame { private MyFrame(){ initComponents(); // <= Auto generated by NetBeans GUI Builder myInits(); } }
讓
myInits()
public
和main()
調用它:public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new ChatFrame().myInits(); } }); }
invokeLater
在構造myInits()
。private myFrame(){ initComponents(); SwingUtilities.invokeLater(new Runnable(){ @Override public void run(){ myInits(); } }); }
我想,沒有什麼不對的methoed因爲initComponents()
本身做各種各樣的GUI操縱。我用這種方法,它工作得很好。
但今天我將MyFrame
更改爲單例,我得到了java.lang.ExceptionInInitializerError
。因爲myInits()
調用MyFrame.getInstance()
並將其放入構造函數中,我在技術上將getInstance()
稱爲另一個getInstance()
。我試圖讓getInstance()
但它沒有奏效。
我個人不喜歡這種方式,因爲我不想myInits()
爲public
。也因爲我更喜歡4號。
這是我自己想出了。因爲實例化本身是在invokeLater()
方法中完成的(參見編號3),我想我可以確定myInits()
將在new myFrame();
完成後運行,我可以安全地調用MyFrame.getInstance()
。
概括起來:
1)所有這些方法是否正確?
2)這些(或其他可能的方法,我可能沒有提到)是否認爲是最佳做法?
3)哪一個是Singleton JFrame的最佳實踐?
4)爲什麼當我我的getInstance()
方法我仍然得到了java.lang.ExceptionInInitializerError
?
通常,單身人士沒有公共構造函數。 –
謝謝@ cricket_007。他們在我的代碼中是私人的。我在這裏修復它。 –