前言
JavaFX是一個強大的圖形和多媒體處理工具包集合,它允許開發者來設計、創建、測試、調試和部署富客戶端程序,並且和Java一樣跨平臺。
組成結構
- javaFX基礎(javaFX系列之launcher啓動器:兩種啓動javaFX的方式及launch(args[])參數設置和獲取)
- 窗體(javaFX2.0窗體(Stage)分析及使用)
- 場景(javaFX2.0場景(Scene)分析及使用)
- 佈局
- UI組件
- 2D/3D圖形系統(windows vista以下使用directx 9.0,windows7使用directx 11.0,macos/linux使用opengl)
- 多媒體(音視頻)(javaFX系列之media:最簡單的javaFX視頻播放器實現)
- 視覺特效
- web組件(javaFX系列之web組件:最簡單的javaFX瀏覽器實現)
- css層疊樣式表(支持css2.0和少量css3.0
- 其他
- JavaFX線程結構分析
節點結構
講到場景Scene,就不得不講javaFX的節點結構,JavaFX把所有控件都設計爲節點Node
窗體(Stage)------設置------>一個場景(Scene)-----添加------>多個節點(Node,可以是UI組件,圖片,音視頻,web瀏覽器等等)
簡單場景功能實現
public class SceneDemo extends Application {
String title="eguid簡單場景Scene功能演示,轉載請註明出處和作者名,blog 。 eguid . cc原創技術文章";
@Override
public void init() throws Exception {
Console.log("窗體打開之前的一些初始化,當前線程:"+Thread.currentThread().getName());
super.init();
}@Override
public void start(Stage primaryStage) throws Exception {
Console.log("打開窗體,當前線程:"+Thread.currentThread().getName());
primaryStage.setTitle(title); // 設置標題Group root=new Group();
//場景,場景必須在窗體Stage初始化後才能創建,只有在javaFX launcher線程的 init()方法和javaFX Application線程中才能進行創建,其他線程會拋出異常。
Scene scene=new Scene(root, 2000,2000,Color.WHITE);//場景不能在javaFX線程外創建
primaryStage.setScene(scene);//設置場景
primaryStage.show();//顯示窗體
}@Override
public void stop() throws Exception {
Console.log("關閉窗體,當前線程:"+Thread.currentThread().getName());
super.stop();
}public static void main(String[] args) {
Console.log("啓動程序");
Application.launch(args);
}}
多場景切換
窗體(Stage)中雖然只可以設置一個場景,但是我們可以通過設置場景的方式來做到多個場景之間切換。比如我們以一個簡單聊天軟件爲例,我們需要兩個場景就可以模擬出大概的樣子:
- 登錄場景(用來輸入用戶名密碼進行登錄)
- 主場景(用戶登錄後進入的主操作場景,查看好友列表之類的)
剛打開窗體顯示的是”登錄場景“,一頓操作猛如虎之後點擊登錄按鈕進入了“主場景”,如何實現這個場景切換的功能。
注意:雖然我們可以通過多個窗體的方式來實現類似場景切換的功能,但是創建和銷燬窗體的資源消耗明顯比創建場景消耗要大得非常多,第一篇文章中已經分析了JavaFX的窗體都包含三個線程(啓動器線程,JavaFX渲染線程和JavaFX Application線程),而我們的多場景切換實際上是共享一個窗體,這樣做資源消耗更少。
多場景切換功能實現
public class SceneChangeSample extends Application {
String title="eguid簡單場景Scene功能演示,轉載請註明出處和作者名,blog 。 eguid . cc原創技術文章";@Override
public void init() throws Exception {
Console.log("窗體打開之前的一些初始化,當前線程:" + Thread.currentThread().getName());
super.init();
}@Override
public void start(Stage primaryStage) throws Exception {
Console.log("打開窗體,當前線程:" + Thread.currentThread().getName());
primaryStage.setTitle(title); // 設置標題Group root = new Group();
// 場景,場景必須在窗體Stage初始化後才能創建,只有在javaFX launcher線程的 init()方法和javaFX
// Application線程中才能進行創建,其他線程會拋出異常。Scene scene = new Scene(root, 2000, 2000, Color.WHITE);// 場景不能在javaFX線程外創建
// 創建第二個場景
Group second = new Group();
Scene secondScene = new Scene(second, 800, 600, Color.BLACK);EventHandler<Event> eventHandler = new EventHandler<Event>() {
@Override
public void handle(Event event) {
EventType<? extends Event> type = event.getEventType();
String name = type.getName();
Console.log("事件名稱:" + name);// KeyEvent.KEY_PRESSED
switch (name) {
case "MOUSE_CLICKED":
// 按鍵後觸發播放動畫效果,播放後完全不影響應用工作線程,說明完全可行
// 可以在事件中處理邏輯計算
Console.log("鼠標點擊");
break;
case "KEY_PRESSED":
// 任意鍵盤按鍵觸發場景切換,切換到第二個場景
primaryStage.setScene(secondScene);
break;
}
event.consume();
}
};
scene.addEventHandler(Event.ANY, eventHandler);// 綁定事件primaryStage.setScene(scene);// 設置第一個場景爲顯示場景
primaryStage.show();// 顯示窗體
}@Override
public void stop() throws Exception {
Console.log("關閉窗體,當前線程:" + Thread.currentThread().getName());
super.stop();
}public static void main(String[] args) {
Console.log("啓動程序");
Application.launch(args);
}}