我有一些初始化代码需要在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。他们在我的代码中是私人的。我在这里修复它。 –