javaFx:stage如何正确关闭?

javaFx:stage如何正确关闭?stage.close()后发生了什么?

前言:stage.close()官方文档的说明其作用相当于stage.hide(),方法执行后stage并没有被正确关闭,如何才能正确关闭stage呢?下面建立一测试项目来探索一番。

一、建立项目msd,内有文件:


(一)、Msd.java  应用程序入口类;

(二)、javaFx控制器类 FXMLDocumentController.java

(三)、FXMLDocument.fxml、HtmlEdit.fxml 是视图文件。

FXMLDocument.fxml定义了一个按钮,HtmlEdit.fxml定义了一个html编辑器。当程序启动时装载FXMLDocument.fxml,点击其中的按钮实现页面跳转到HtmlEdit.fxml并进入全屏模式,按下ctrl+k退出全屏。再次点击按钮一次循环。

二、JavaFx控制器类 FXMLDocumentController.java实现事件消息的监听控制。

(一)、该控制器类实现了(implements)Initializable接口方法:public void initialize(URL url, ResourceBundle rb) {},声明并实例化

private final Stage stageTwo = new Stage();作为全局变量,

(二)、定义了事件消息处理器方法: private void handleButtonAction(ActionEvent event){},并调用loadFXML("HtmlEdit.fxml", stageTwo);实现页面的切换;

(三)、loadFXML()方法:装载第二个页面HtmlEdit.fxml并进入全屏模式,附上代码解析如下:

public AnchorPane loadFXML(String fxmlFileName, Stage stage) {

        //工具方法:载入任意的FXML文件,并切换

        if (fxmlFileName == null || fxmlFileName.isEmpty() || !fxmlFileName.endsWith(".fxml")) {

            return null;

        }

        //单例模式:只能装载1次,直到关闭。

        if (stage != null) {

            if (stage.getScene() != null) {

                if (stage.getScene().getUserData().toString().equals("showing")) {

                    if (!stage.isShowing()) {

                      //下面这条语句的作用是设置全屏模式退出的组合键

                        stage.setFullScreenExitKeyCombination(KeyCombination.valueOf("Ctrl+K"));

                        //下面这条语句的作用是设置全屏模式进入后在屏幕的提示

                        stage.setFullScreenExitHint("进入了全屏模式....");

                        //下面这条语句的作用是使stage进入全屏模式

                        stage.setFullScreen(true);

                        stage.show();

                    }

                    return (AnchorPane) stage.getScene().getRoot();

                }

            }

        }

        AnchorPane pane = null;

        try {

            pane = (AnchorPane) FXMLLoader.load(getClass().getResource(fxmlFileName));

        } catch (IOException ex) {

            Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);

        }

        if (pane != null && stage != null) {

            Scene scene = new Scene(pane);

            scene.setUserData("showing");

            stage.setScene(scene);

            stage.show();

            //监听舞台关闭事件:

            stage.setOnCloseRequest((WindowEvent event) -> {

                System.out.println("stage is hidded and then closed!");   

                stage.close();//注意!相当于stage.hide(),舞台并没有销毁。

                //npe:  System.out.println(stage.getUserData().toString());

            });

            //监听舞台隐藏事件(关闭按钮被点击默认是隐藏效果,同上)

            stage.setOnHidden((WindowEvent event) -> {

                System.out.println("stage hidded! ");

                //npe: 因为onCloseRequest优先被执行了,stage.close()  stage.getUserData().toString()

            });

            //监听舞台正在被隐藏,尚未隐藏完毕事件。优先于setOnHidded()

            stage.setOnHiding((WindowEvent event) -> {

                System.out.println("stage is hidding....");

            });

            //监听舞台正准备显示出来事件

            stage.setOnShowing((WindowEvent event) -> {

                System.out.println("stage is showing...");

            });

            //监听舞台显示完毕事件

            stage.setOnShown((WindowEvent event) -> {

                System.out.println("stage is showed now!");

            });

            stage.setFullScreenExitKeyCombination(KeyCombination.valueOf("Ctrl+K"));

            stage.setFullScreenExitHint("进入了....");

            stage.setFullScreen(true);

        }

        return pane;

    }

三、问题

当stage进入全屏模式,按下ctrl+k退出后,“关闭”stage,再次点击按钮程序工作“正常”,但仔细研究就会发现,当我们将调用stage.close()将stage关闭后:

(一)、再次引用stage将会抛出NPE异常,说明stage已经被置为null引用。             

               stage.close();//注意!相当于stage.hide(),舞台并没有销毁。

                //npe:  System.out.println(stage.getUserData().toString());

(二)、再次点击按钮,却发现stage还在,以下代码被执行:

//单例模式:只能装载1次,直到关闭。

        if (stage != null) {   //注意这里!stage在第一次被close()后,再引用会抛出NPE;但是第二次点击按钮它却不是null

            if (stage.getScene() != null) {

                if (stage.getScene().getUserData().toString().equals("showing")) {

                    if (!stage.isShowing()) {

                        stage.setFullScreenExitKeyCombination(KeyCombination.valueOf("Ctrl+K"));

                        stage.setFullScreenExitHint("进入了....");

                        stage.setFullScreen(true);

                        stage.show();

                    }

                    return (AnchorPane) stage.getScene().getRoot();

                }

            }

        }

而stage只是被实例化了一次,作为全局变量使用。当stage.close()调用后,stage并没有被真的销毁,照说应该会被垃圾回收器回收,然而结果还是没有被回收内存没有释放,对stage的引用却处于既是null又是非null的诡异状态中。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容

  • 一. Java基础部分.................................................
    wy_sure阅读 3,805评论 0 11
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,308评论 0 10
  • 50道经典Java编程练习题,将数学思维运用到编程中来。抱歉哈找不到文章的原贴了,有冒犯的麻烦知会声哈~ 1.指数...
    OSET我要编程阅读 6,950评论 0 9
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,694评论 0 3
  • 今日体验;工作中要不断的和大家配合好!大家在一起产生默契,工作就会流畅很多,也会提升工作效率!核心:互相支持,互相...
    谢波1阅读 193评论 0 0