JavaSwing中初始化代码的最佳实践

JavaSwing中初始化代码的最佳实践,java,swing,Java,Swing,我有一些初始化代码需要在Java Swing应用程序启动时运行,而不会触发任何事件 我的初始化代码在myInits()函数中myInits()执行各种操作:从文件读取配置,设置背景和一些标签,生成网络线程,初始化变量 根据谷歌搜索和我自己的知识,我找到了实现这一目标的不同方法(如果以下任何假设是错误的,请纠正我): 触发窗口打开时运行myInits() 这确保GUI已绘制,并且myInits()可以访问任何组件并对其进行更改。不幸的是,我无法使用此方法,因为我的应用程序启动时是隐藏的,Windo

我有一些初始化代码需要在Java Swing应用程序启动时运行,而不会触发任何事件

我的初始化代码在
myInits()函数中
myInits()
执行各种操作:从文件读取配置,设置背景和一些标签,生成网络线程,初始化变量

根据谷歌搜索和我自己的知识,我找到了实现这一目标的不同方法(如果以下任何假设是错误的,请纠正我):

  • 触发
    窗口打开时运行
    myInits()
    这确保GUI已绘制,并且
    myInits()
    可以访问任何组件并对其进行更改。不幸的是,我无法使用此方法,因为我的应用程序启动时是隐藏的,
    Window\u Opened
    不会被触发


  • myInits()
    放入
    JFrame
    构造函数中:

    public class MyFrame extends javax.swing.JFrame {
    
        private MyFrame(){
    
            initComponents();  // <= Auto generated by NetBeans GUI Builder
    
            myInits();
    
        }
    }
    
  • 我个人不喜欢这个方法,因为我不想
    myInits()
    成为
    public
    。也因为我更喜欢4号


  • 构造函数中的调用器
    myInits()

    private myFrame(){
    
        initComponents();
    
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run(){
                myInits();
            }
        });
    
    
    } 
    
  • 这是我自己想到的。因为实例化本身是在
    invokeLater()
    方法中完成的(参见编号3),所以我想我可以确定
    myInits()
    将在
    newmyframe()之后运行已经完成,我可以安全地调用
    MyFrame.getInstance()


    总而言之:

    1) 这些方法都正确吗

    2) 这些(或我可能没有提到的其他可能的方法)是否被认为是最佳实践

    3) 哪一个是单例JFrame的最佳实践


    4) 为什么当我
    synchronized
    my
    getInstance()
    方法时,我仍然得到了
    java.lang.ExceptionInInitializerError

    在我看来,如果您的初始化逻辑不是特定于ui的,那么它应该在main中。从myinit中提取一个单独的类,并在main中调用它


    您也可以使用enum将其设置为单例,并使用它,以便在第一次使用/应用程序加载时对其进行初始化。

    通常,单例没有公共构造函数。谢谢@cricket\u 007。它们在我的代码中是私有的。我在这里修复了它。类的初始化代码应该在构造函数中,而不是在main中。如果代码可以被提取到一个方法中,那么没有理由不这样做,因为这会使构造函数块变小,这取决于他试图初始化什么。如果他是框架/窗口初始化中的Trina to init应用程序,这比在main中进行静态调用更麻烦。或者实际上我们应该有一个应用程序类来完成所有初始化,然后在没有看到
    myInits
    myInits()的内容的情况下呈现难以分辨的视图。它所做的是初始化一些变量、从文件读取配置、更改一些GUI元素(如图标和标签)、向GUI元素添加自定义事件侦听器、生成线程以扫描网络。
    private myFrame(){
    
        initComponents();
    
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run(){
                myInits();
            }
        });
    
    
    }