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 Thread,QuantumRenderer 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); } }