javaFX2.0場景(Scene)分析及使用,多場景切換實現

前言

JavaFX是一個強大的圖形和多媒體處理工具包集合,它允許開發者來設計、創建、測試、調試和部署富客戶端程序,並且和Java一樣跨平臺。

組成結構

節點結構

講到場景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);
    }

}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章