JavaFX - Change Stage

This article will introduce how to change stage(window) using JavaFX.

As we all know, JavaFX has Architecture with stage, scene, node .

解释一下这三个概念:


在这里插入图片描述
其实scene是stage的一部分,但是因为javafx的设计的窗口部分,复用了操作系统自身的窗口的api。
所以你在不同的操作系统下,看到的窗口样式是不一样的,stage主要就是用来封装这一层
stage主要有最大化,最小化,关闭这些按钮,就是最外层那些东西
然后scene就是内容的基础类,所有的node都要装到scene里面去
所以scene就是一个分界线,跟os相关的,放在stage里面,跟用户内容相关的,都在scene里面

javafx提供一个scene给你,然后你把你的gui内容放到scene里面去就行了

摘自:https://www.zhihu.com/question/369107808


补充一些JavaFX 基础:
javafx运行时有三个线程:

  • JavaFX launcher Thread (加载使用)
  • JavaFX Application Thread (运行使用)
  • QuantumRenderer Thread (渲染使用)

首先启动JavaFX launcher Thread, 之后 JavaFX Application ThreadQuantumRenderer Thread两个线程是异步执行。

  • Stage只允许JavaFX Application线程进行控制,其他线程是无法对javaFX的窗体进行控制和调用。
  • Scene 必须在窗体Stage初始化后才能创建,只有在JavaFX launcher线程的init()方法和JavaFX Application线程中才能进行创建,其他线程会抛出异常

首先介绍Stage窗口切换

目录结构:
在这里插入图片描述

Main.java类(启动类)

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        //访问test1.fxml创建Stage,并显示
        Stage test1 = Context.factory.createStage("我是标题1", 800, 600, "/Resource/Main.fxml");
        test1.show();
        //访问test2.fxml创建Stage
        Context.factory.createStage("我是标题2", 800, 600, "/Resource/Second.fxml");
        //从test1跳转到test2
        Context.stageManager.jump("/Resource/Main.fxml", "/Resource/Second.fxml");
    }


    public static void main(String[] args) {
        launch(args);
    }
}

实例获取类

//在全局上下文中,持有StageManager和Factory的实例,使用时从此处获取
public class Context {
    public static StageManager stageManager = new StageManager();
    public static Factory factory = new Factory();
}

Stage 创建类

public class Factory {

    public Stage createStage(String title, int width, int height, String file)throws IOException{
        URL url = getClass().getResource(file);
        Parent root = FXMLLoader.load(url);
        Stage stage = new Stage();
        stage.setTitle(title);
        stage.setScene(new Scene(root, width, height));
        stage.setResizable(false);
        //设置在stage关闭时需要进行的操作
        stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent event) {
                //此处当stage关闭时,同时结束程序,避免stage关闭后,程序界面关闭了,但后台线程却依然运行的问题
                System.exit(0);
            }
        });
        //初始化Stage时将该实例添加进StageManager的容器中,方便管理
        Context.stageManager.addStage(file, stage);
        return stage;
    }
}

Stage 管理类

/** Stage管理类 */
public class StageManager {
    private Map<String, Stage> stageMap = new HashMap<>();//存放所有的Stage实例

    public void addStage(String name, Stage stage){
        stageMap.put(name, stage);
    }

    public Stage getStage(String name){
        return stageMap.get(name);
    }

    public void closeStage(String name){
        stageMap.get(name).close();
    }

    //实现Stage的跳转,从currentStage跳转到targetStage
    public void jump(String currentStageName, String targetStageName){
        stageMap.get(currentStageName).close();
        stageMap.get(targetStageName).show();
    }

    public void release(String name){
        stageMap.remove(name);
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值