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