■ 关于Stage
一个Stage类(javafx.stage.Stage)对象代表一个JavaFX的窗体
每一个stage都只包含一个scene,这个scene即代表窗体内所显示的内容
当一个JavaFX程序启动时,后台会创建一个Stage对象,并将其传递给自己实现的Application类的start()方法
该stage对象(primaryStage)代表程序的主窗体,也可根据情况,在程序的生命周期内创建多个自定义窗体
注:这里所说的窗体,都仅限于同一个javafx程序进程下的窗体
■ 创建Stage
Stage stage = new Stage(); //创建Stage
■ 显示Scene
仅仅创建Stage类对象无法显示窗体,需要调用show()或showAndWait()方法
Stage stage = new Stage();
stage.show();
// stage.showAndWait();
show()和showAndWait()的区别
show(): 显示对应窗体,后面的代码可以继续执行
showAndWait(): 显示对应窗体,该方法后面的代码不会被执行,除非关闭该窗体; 简单讲就是代码执行到showAndWait()时,就会停到这个地方,窗体关闭了,后面的代码才会继续执行
■ Scene
如果要在窗体里显示组件,一定要为scene指定组件,并为stage设定scene
这样,当stage执行show()方法时,才会将scene的内容显示出来
VBox vBox = new VBox(new Label("A JavaFX Label")); //创建组件
Scene scene = new Scene(vBox); //为scene指定该组件
Stage stage = new Stage();
stage.setScene(scene); //为stage设定scene
stage.show();
■ Title
通过setTitle()方法为窗体设定标题
stage.setTitle("JavaFX Stage Window Title"); //为窗体设定标题
■ Position
通过setX()和setY()方法为窗体设定显示坐标,坐标点是窗体的左上方一点的坐标点
通常设定坐标点时,需要同时为窗体设定长和宽,否则窗体会非常的小
Stage stage = new Stage();
stage.setX(50);
stage.setY(50)
■ Width和Height
通过setWidth()和setHeight()方法为窗体设置长和宽
Stage stage = new Stage();
stage.setWidth(600);
stage.setHeight(300);
■ Modality
modality即窗口模态,它可以决定当前窗体是否可以block其他窗体
通过initModality()方法来设置窗体模态
Modality.APPLICATION_MODAL: 阻止用户访问所有其他的窗体,直到该窗体关闭
Modality.WINDOW_MODAL: 仅阻止用户访问所有该窗体的owner窗体,直到该窗体关闭
Modality.NONE: 不会阻止用户访问任何窗体
应用场景:
Modality.APPLICATION_MODAL和Modality.WINDOW_MODAL主要用于程序中母窗体点击按钮弹出对话框,消息框之类的场景,关闭了对话框和消息框之后,才可以对母窗体继续进行操作
Modality.NONE主要用于类似浏览器打开网页这种方式,可以关闭访问任意曾经打开的tab页
primaryStage.setTitle("JavaFX App");
Stage stage = new Stage();
stage.initModality(Modality.APPLICATION_MODAL); //stage对应窗体会阻止用户访问primaryStage对应的窗体,除非stage对应窗体关闭
//stage.initModality(Modality.WINDOW_MODAL);
//stage.initModality(Modality.NONE);
primaryStage.show();
stage.showAndWait();
■ Owner
一个窗体可以是另一个窗体的owner
通过initOwner()方法为窗体设置owner
primaryStage.setTitle("JavaFX App");
Stage stage = new Stage();
stage.initModality(Modality.WINDOW_MODAL);
stage.initOwner(primaryStage);
primaryStage.show();
stage.showAndWait();
■ Style
窗体也可以定义不同的样式
通过initStyle()设置样式
DECORATED: 显示标准的窗体和白色背景,并附带操作系统装饰栏(包括标题栏,最小化,最大化和关闭按钮)和白色背景
UNDECORATED: 显示标准的窗体和白色背景,不附带操作系统装饰栏
TRANSPARENT: 透明窗体
UNIFIED: 类似DECORATED,区别就是操作系统装饰栏和窗体内容之间不显示边界线
UTILITY: 类似DECORATED,区别就是操作系统装饰栏只有关闭按钮
stage.initStyle(StageStyle.DECORATED);
//stage.initStyle(StageStyle.UNDECORATED);
//stage.initStyle(StageStyle.TRANSPARENT);
//stage.initStyle(StageStyle.UNIFIED);
//stage.initStyle(StageStyle.UTILITY);
■ Full Screen
窗体也可以设置成全屏模式
通过setFullScreen()方法设置窗体的全屏模式
注: 设置全屏模式需要为stage设置scene,否则不会生效
VBox vbox = new VBox();
Scene scene = new Scene(vbox);
primaryStage.setScene(scene);
primaryStage.setFullScreen(true);
primaryStage.show();
■ Event
Stage生命周期中包含以下事件:
- Close Request
- Hiding
- Hidden
- Showing
- Shown
□ Close Stage Event Listener
当点击窗体右上角的关闭按钮时,触发该事件
primaryStage.setOnCloseRequest((event) -> {
System.out.println("Closing Stage");
});
□ Hiding Stage Event Listener
当stage正在被隐藏但还没完成隐藏时,触发该事件
primaryStage.setOnHiding((event) -> {
System.out.println("Hiding Stage");
});
□ Hidden Stage Event Listener
当stage完成隐藏时,触发该事件
primaryStage.setOnHidden((event) -> {
System.out.println("Stage hidden");
});
□ Showing Stage Event Listener
当stage正在被显示但还没完成显示时,触发该事件
primaryStage.setOnShowing((event) -> {
System.out.println("Showing Stage");
});
□ Shown Stage Event Listener
当stage完成显示之后,触发该事件
primaryStage.setOnShown((event) -> {
System.out.println("Stage Shown");
});
□ Stage Keyboard Events Listener
当光标放在窗体时,Stage可以捕获任何键盘上操作
primaryStage.addEventHandler(KeyEvent.KEY_PRESSED, (event) -> {
System.out.println("Key pressed: " + event.toString());
switch(event.getCode().getCode()) {
case 27 : { // 27 = ESC key
primaryStage.close();
break;
}
case 10 : { // 10 = Return
primaryStage.setWidth( primaryStage.getWidth() * 2);
}
default: {
System.out.println("Unrecognized key");
}
}
});