35

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

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

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

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

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

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

4

3 回答 3

53

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

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

ashide()相当于关闭stage close()close()hide()也关闭stage。

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

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

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

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

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

于 2012-04-18T20:06:59.790 回答
24

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

((Node)(event.getSource())).getScene().getWindow().hide();
于 2014-02-21T15:38:14.183 回答
3

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

    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));
于 2018-09-08T12:33:00.190 回答