JavaFX 2.0:关闭阶段(窗口)

Posted

技术标签:

【中文标题】JavaFX 2.0:关闭阶段(窗口)【英文标题】:JavaFX 2.0: Closing a stage (window) 【发布时间】:2012-04-30 00:57:54 【问题描述】:

我正在 JavaFX 2.0 中制作应用程序。从我的主窗口中,我开始一个带有一些设置的新窗口。调整完设置后,我想按下“保存更改”之类的按钮。

我想要这个按钮来保存更改并关闭窗口。 通过关闭我的意思是杀死它,而不是将它放在背景中或设置可见性。 我读过一个方法 Stage.close()

http://docs.oracle.com/javafx/2.0/api/javafx/stage/Stage.html

如你所见,它类似于 Hide() 方法,它只是隐藏窗口,而不是关闭它。

问:有人知道任何方法或有一些代码可以帮助我关闭窗口吗?

我们将不胜感激所有帮助。 谢谢!

【问题讨论】:

***.com/questions/13567019/… 【参考方案1】:

您链接的文档指出stage.close()

关闭此阶段。此调用等效于 hide()。

由于hide() 相当于close()close() 关闭舞台,那么hide() 也关闭舞台。

当应用程序中的所有阶段都被隐藏(或关闭,因为它是同一件事)时,应用程序退出。令人困惑,我知道,但这正是 JavaFX 团队决定命名和实现动作的方式。

如果需要,Platform.setImplicitExit(boolean) 方法可用于关闭在最后一个窗口关闭或隐藏时退出应用程序的默认行为。

那么问题来了,我们如何隐藏舞台而不完全关闭它?

我认为hide() 或等效的close() 方法不会像释放与窗口相关的所有资源那样“完全”关闭舞台(只要您在某处保留对舞台的引用)。我认为它只是让舞台不可见。您可能可以在调用close() 之后调用show(),并且窗口可能会再次可见(我没有尝试过)。但是,如果您要这样做,那么调用 hide() 而不是 close() 会更直观。

我的猜测是,如果您不再保留对应用程序中某个阶段的任何引用并且该阶段已关闭或隐藏,那么每当 JVM 的算法决定垃圾收集这些资源时,JVM 可能会释放与该阶段相关的所有资源(再次,我没有测试这个,它可能不会那样工作)。

【讨论】:

感谢您的解释,这对我的理解很有帮助! :) 我想知道如果窗口是舞台的唯一窗口,Window.hide() 是否也等同于 Stage.hide() 和 Stage.close()?所以我不需要传递对舞台的引用。 我不明白你的评论 stefan。您可能想创建一个新问题。 那么问题来了,如何在不完全关闭的情况下隐藏舞台? @TharinduSathischandra 根据您的问题更新了答案。【参考方案2】:

对于也有兴趣收听关闭窗口事件的用户,在窗口中添加一个事件过滤器:(当用户按下应用程序的操作系统关闭按钮时也会触发此事件)

    yourWindow.addEventFilter(WindowEvent.WINDOW_CLOSE_REQUEST, event -> 
        // add your code here to handle the close event
        // use event.consume(); to prevent the application from closing
    );

如果您需要使用自定义关闭按钮关闭应用程序,请在按钮的onAction 方法中触发事件:

 yourWindow.fireEvent(new WindowEvent(window, WindowEvent.WINDOW_CLOSE_REQUEST));

【讨论】:

【参考方案3】:

这对我来说非常有效(导入 Node):

((Node)(event.getSource())).getScene().getWindow().hide();

【讨论】:

我试图从 menuitem ActionEvent 中隐藏窗口,但出现异常“menuitem 无法转换为 Node”。这是例外Caused by: java.lang.ClassCastException: javafx.scene.control.MenuItem cannot be cast to javafx.scene.Node

以上是关于JavaFX 2.0:关闭阶段(窗口)的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX如何改变阶段

如何在我的应用程序的javafx 2.0中更改阶段标题栏上的图标[重复]

关闭阶段JavaFX后如何停止WebEngine?

JavaFX:阶段关闭处理程序

如何在一定时间后关闭一个阶段JavaFX

窗口/舞台失去焦点时的事件