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);
    }

}

 

 

 

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