2016-03-04 70 views
1

我有一些初始化代碼需要在Java Swing應用程序啓動時運行,而沒有任何事件被觸發。在Java Swing中初始化代碼的最佳實踐

我的初始化代碼位於myInits()函數中。 myInits()做各種事情:從文件讀取配置,設置背景和一些標籤,產生網絡線程,初始化變量。

從谷歌搜索和我自己的知識,我已經找到了不同的方式來實現這一目標(請糾正我,如果任何下文所述的假設是錯誤的):

  1. 運行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(); 
    
        } 
    } 
    
  • 我想,沒有什麼不對的methoed因爲initComponents()本身做各種各樣的GUI操縱。我用這種方法,它工作得很好。

    但今天我將MyFrame更改爲單例,我得到了java.lang.ExceptionInInitializerError。因爲myInits()調用MyFrame.getInstance()並將其放入構造函數中,我在技術上將getInstance()稱爲另一個getInstance()。我試圖讓getInstance()​​但它沒有奏效。


  • myInits()publicmain()調用它:

    public static void main(String args[]) { 
    
        java.awt.EventQueue.invokeLater(new Runnable() { 
         public void run() { 
          new ChatFrame().myInits(); 
         } 
        }); 
    } 
    
  • 我個人不喜歡這種方式,因爲我不想myInits()public。也因爲我更喜歡4號。


  • invokeLater在構造myInits()

    private myFrame(){ 
    
        initComponents(); 
    
        SwingUtilities.invokeLater(new Runnable(){ 
         @Override 
         public void run(){ 
          myInits(); 
         } 
        }); 
    
    
    } 
    
  • 這是我自己想出了。因爲實例化本身是在invokeLater()方法中完成的(參見編號3),我想我可以確定myInits()將在new myFrame();完成後運行,我可以安全地調用MyFrame.getInstance()


    概括起來:

    1)所有這些方法是否正確?

    2)這些(或其他可能的方法,我可能沒有提到)是否認爲是最佳做法?

    3)哪一個是Singleton JFrame的最佳實踐?

    4)爲什麼當我​​我的getInstance()方法我仍然得到了java.lang.ExceptionInInitializerError

    +2

    通常,單身人士沒有公共構造函數。 –

    +0

    謝謝@ cricket_007。他們在我的代碼中是私人的。我在這裏修復它。 –

    回答

    0

    在我看來,如果你的初始化邏輯不是特定於ui的,那應該是主要的。從myinit中提取一個單獨的類,然後在main中調用它。

    你也可以使用枚舉來使它成爲單例,並使用它,以便在第一次使用/應用程序加載時它被初始化。

    +0

    類的初始化代碼應該在構造函數中,而不是主要的。如果代碼可以提取到一個方法,沒有理由不這樣做,因爲它使構造函數塊更小。 –

    +0

    這取決於他正在嘗試初始化什麼。如果他是Trina在框架/窗口初始化中初始化應用程序,則比在main中進行靜態調用更麻煩。 –

    +0

    或者實際上,我們應該有一個應用程序類來完成所有的初始化,然後呈現視圖 –