一、介绍
窗口Stage为图中标绿部分:
实际为如下部分:
不同的操作系统表现的样式不同,以下都是以Windows操作系统为例,为了使大家更清楚Stage是那部分,直接看以下图,可能更清楚:
有点潦草,但意思就是窗口框体
二、窗口Stage常用属性
·Title,窗口标题
·icon,窗口图标
·resizable,窗口是否可改变大小
·x,y,应用显示在桌面位置
·width,height,窗口宽、高
·StageStyle,窗口风格
·Modality,窗口是否模态
·event,窗口事件
·还有更多属性,这里就不一一罗列并且体验啦
三、常用属性使用及演示
1、Title,设置窗口的标题
public class App extends Application{
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("我的应用");
primaryStage.show();
}
public static void main(String[] args )
{
launch(args);
}
}
效果:可以看到窗口的名称已经变为“我的应用”:
2、icon,设置窗口的图标,此处的图标为阿里巴巴矢量图标库中下载使用的,敢兴趣的小伙伴可以进行下载使用
primaryStage.getIcons().add(new Image("icon/cookie.png"));
效果:可以看到窗口的图标已经变为我们自定义的图标:
3、resizable,是否允许改变窗口大小
默认的情况下是true,当我们将鼠标移动至窗口边缘时,可以拖动任意改变窗口大小,我们将resizable设置为false,进行验证效果
primaryStage.setResizable(false);
效果:可以看到当我们将鼠标移动至窗口边缘时,无法拖拉进行窗口大小改变,此处请自行验证
4、x,y,用于设置窗口在桌面上显示的位置
默认情况下,当我们没有设置x,y时,窗口显示在桌面正中,当我们设置x,y时,窗口就将按照我们的设置进行显示,以下进行小狗演示
primaryStage.setX(20);
primaryStage.setY(20);
效果:可以看到当我们设置了窗口x,y之后,窗口将按照具体位置进行展示,,此处请自行验证
5、width,height,用于设置窗口大小
primaryStage.setWidth(200);
primaryStage.setHeight(200);
效果:可以看到窗口大小随着我们设置width,height进行改变:
6、StageStyle,用户设置窗口的样式
我们可以通过枚举类选择窗口样式,默认的窗口样式为“DECORATED”
枚举类StageStyle有以下样式:
- DECORATED
- UNDECORATED
- TRANSPARENT
- UTILITY
- UNIFIED
我们逐一体验下以上所有样式
1)DECORATED
用纯白背景和平台装饰定义一个普通的窗口样式
primaryStage.initStyle(StageStyle.DECORATED);
效果如下:
2)UNDECORATED
定义一个窗口样式,背景为纯白,没有任何装饰
primaryStage.initStyle(StageStyle.UNDECORATED);
该样式有以下两种情况:
·当我们没有为Stage设置Sence时,我们在桌面上将看不到任何东西
·当我们有为Stage设置Sence时,可以看到,该窗口样式的最大特点就是,我们看不到标题、图表、隐藏按钮,全屏按钮、关闭按钮那一栏,效果如下:
3)TRANSPARENT
定义具有透明背景且没有装饰的窗口样式。
primaryStage.initStyle(StageStyle.TRANSPARENT);
光凭肉眼上看,与UNDECORATED样式一致,具体还需后面仔细体验才能知道:
4)UTILITY
定义具有纯白背景和用于实用程序窗口的最小平台装饰的样式。
primaryStage.initStyle(StageStyle.UTILITY);
可以看到,该样式的窗口是没有图表、隐藏按钮以及全屏按钮的,效果如下:
5)UNIFIED
使用平台装饰定义窗口样式,并消除客户端区域和装饰之间的边界。客户区背景与装修统一
primaryStage.initStyle(StageStyle.UNIFIED);
光凭肉眼上看,该窗口样式与DECORATED一致,具体还需后面仔细体验才能知道:
·
7、Modality,窗口是否模态
Modality有以下枚举类型:
- NONE
- WINDOW_MODAL
- APPLICATION_MODAL
1)Modality之NONE,就是我们窗口默认的配置:
public class App extends Application{
@Override
public void start(Stage primaryStage) throws Exception {
// 节点node
Button button = new Button("open new scene");
// 给按钮添加点击事件,点击后打开一个新的窗口
button.setOnAction(e -> {
Label label = new Label("我是新窗口");
BorderPane borderPane = new BorderPane(label);
Scene scene = new Scene(borderPane);
Stage stage = new Stage();
stage.setScene(scene);
stage.show();
});
BorderPane borderPane = new BorderPane(button);
// 场景scene
Scene scene = new Scene(borderPane, 300, 300);
// 窗口Stage
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args )
{
launch(args);
}
}
以上我们没有设置Modality,你也可以添加以下配置
stage.initModality(Modality.NONE);
以上当我们点击按钮时,将会打开一个新的窗口,而且此时,我们可以操作其他窗口,效果如下:
可以看到,最大窗口的关闭是可以点击的
2)、Modality之APPLICATION_MODAL
当我们为新窗口添加如下配置时,我们便不能操作其他窗口了:
stage.initModality(Modality.APPLICATION_MODAL);
效果如下:
可以看到,最大窗口的关闭是不可以点击的
3)Modality之WINDOW_MODAL
public class App extends Application{
@Override
public void start(Stage primaryStage) throws Exception {
// 节点node1
Button button = new Button("open new scene1(WINDOW_MODAL)");
button.setLayoutX(20);
button.setLayoutY(20);
// 给按钮添加点击事件,点击后打开一个新的窗口
button.setOnAction(e -> {
Label label = new Label("WINDOW_MODAL");
BorderPane borderPane = new BorderPane(label);
Scene scene = new Scene(borderPane);
Stage stage = new Stage();
stage.setWidth(200);
stage.setHeight(200);
stage.setScene(scene);
// 指定父窗口,配合WINDOW_MODAL使用
stage.initOwner(primaryStage);
stage.initModality(Modality.WINDOW_MODAL);
stage.show();
});
// 节点node2
Button button2 = new Button("open new scene2(NONE)");
button2.setLayoutX(20);
button2.setLayoutY(50);
// 给按钮添加点击事件,点击后打开一个新的窗口
button2.setOnAction(e -> {
Label label = new Label("NONE");
BorderPane borderPane = new BorderPane(label);
Scene scene = new Scene(borderPane);
Stage stage = new Stage();
stage.setWidth(200);
stage.setHeight(200);
stage.setScene(scene);
stage.show();
});
AnchorPane anchorPane = new AnchorPane();
anchorPane.getChildren().add(button);
anchorPane.getChildren().add(button2);
// 场景scene
Scene scene = new Scene(anchorPane, 300, 300);
// 窗口Stage
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args )
{
launch(args);
}
}
当我们点击两次NONE按钮,生成两个NONE模态生效的窗口,再点击一次WINDOW_MODAL按钮,发现,由于WINDOW_MODAL的父窗口就是我们一开始看到的窗口,该窗口是不能够点击使用的,而两个NONE窗口是能够正常使用的,以上就是WINDOW_MODAL模态类型的使用,效果如下:
可以看到,NONE模态窗口是可以操作的,WINDOW_MODAL也可以,但是最大窗口不行
8、event,事件
如关闭窗口事件
//Platform.setImplicitExit(false);
primaryStage.setOnCloseRequest(event -> {
event.consume();
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.setTitle("退出程序");
alert.setHeaderText(null);
alert.setContentText("是否退出程序?");
Optional<ButtonType> result = alert.showAndWait();
if(result.get().equals(ButtonType.OK)){
Platform.exit();
}
});
显示效果如下:
四、其他章节
待补充