2016-03-04 130 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

    或者实际上,我们应该有一个应用程序类来完成所有的初始化,然后呈现视图 –