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