1. 程式人生 > >關於JavaFx程式執行過程的問題

關於JavaFx程式執行過程的問題

最近在做一個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常等!!!

血與淚的教訓啊!!