JavaFx基础学习【二】:Stage

5 篇文章 2 订阅

目录

前言

一、介绍

二、窗口Stage常用属性

三、常用属性使用及演示

四、其他章节


前言

如果你还没有看过前面的文章,可以通过以下链接快速前往学习:

JavaFx基础学习【一】:基本认识_明天再去学习的博客-CSDN博客

一、介绍

窗口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();
    }
});

显示效果如下:

四、其他章节

JavaFx基础学习【三】:Scene_明天再去学习的博客-CSDN博客

JavaFx基础学习【四】:UI控件的通用属性_明天再去学习的博客-CSDN博客 

JavaFx基础学习【五】:FXML布局文件使用_明天再去学习的博客-CSDN博客 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值