最近在做一个24点的联网游戏,其中使用了JavaFx做界面,所以当时就创建了一个类client_ui, 这个类继承Application,这样就可以在后续能创建多个客户端界面,并在这个类有一个socket作为通信的套接字。但是在启动客户端时,创建了一个client_ui,然后在调用·Application.launch(); 来显示界面,可是明明在创建client_ui类之后已经声明并初始化的控件都是null。在调试过程中发现,使用 client_ui client = new client_ui(); 会创建一个对象,然而执行 client.launch()后又会自动创建一个client_ui 对象,这个对象和 client_ui client = new client_ui(); 创建的对象并不是同一个对象。后来将程序执行的过程的信息打印出来逐一比对,发现以下问题:
client_ui类如下:
public class client_ui extends Application{
//这里定义一些成员变量
HBox hb = new HBox();
VBox vb = new VBox();
Label lab1;
Label lab2 = new Label();
public client_ui(){
...
}
public void init(){
...
}
public void start(Stage stage){
...
}
public void play(){
//launch方法是Application类中的静态方法,
//它创建Application类的实例,并且开始了JavaFX的生命周期
Application.launch();
}
...
}
执行client_ui client = new client_ui();
后,这个类的执行过程:
public client_ui() //完成初始化后就退出client_ui类的执行
执行client.play();
后:
public void play() //启动这个应用
--> public client_ui() //完成这个应用的初始化
--> public void init() //默认的init方法什么也不做,但我们可以重新该方法,以实现特定的初始化任务
--> public void start(Stage stage) //start方法用于创建并显示UI接口
由上面的执行过程可以发现,执行launch方法后还会创建一个对象,这里的疑问就是原来通过 new client_ui(); 创建的对象哪去了?client.play();调用的不应该是 client的launch方法吗?
为什么调用client.play(); 后悔再次创建一个对象?
但是,希望各位有类似困惑的朋友也注意一下,每当调用launch()方法后都会自动创建一个对象!!!
还有一点就是:
由于在client_ui 类里定义了一些成员变量,而且有些经过了初始化,有些没有经过初始化,在调用构造函数之前,会初始化那些有初始化语句的成员,对与那些没有初始化的,只声明的变量则不会执行,所以要注意在使用之前一定有初始化,否则会出现初始化异,如 java.lang.IllegalStateException: Toolkit not initialized 、 java.lang.ExceptionInInitializerError
常等!!!
血与泪的教训啊!!!