【问题标题】:How to close entire app when a TornadoFX window is closed?TornadoFX 窗口关闭时如何关闭整个应用程序?
【发布时间】:2020-05-02 22:15:12
【问题描述】:

TornadoFX 窗口关闭时如何关闭整个应用程序?

使用 JavaFX 通常是:

val app = JFrame()
app.defaultCloseOperation = JFrame.EXIT_ON_CLOSE

有没有办法检测 TornadoFX 视图是否关闭?

【问题讨论】:

  • @Abra 这是一个 TornadoFX 应用程序。
  • "对于 JavaFX,它通常是:val app = JFrame() app.defaultCloseOperation = JFrame.EXIT_ON_CLOSE" 除了那是 Swing,而不是 JavaFX。另请注意,TornadoFX 的核心只是 JavaFX 之上的 Kotlin 框架。

标签: java kotlin tornadofx


【解决方案1】:

通常,关闭初级阶段会激活 App 类的stop() 函数。这是您想要覆盖的内容以执行您自己的关机例程:

class MyApp : App (FirstView::class) {
    override fun stop() {
        super.stop()
        /* Do your shutdown routine here  */
    }
}

但是,我遇到过这种逻辑被破坏的情况,只有关闭所有程序窗口才有效。如果您想要确保关闭程序的“主窗口”,请将其添加到您的 App 类中:

override fun start(stage: Stage) {
   stage.setOnHiding { stop() }
}

编辑:我会使用您的 IDE 来查看 stop() 函数究竟为您做了什么,以及查看 Abra 链接的答案以了解 vanilla JavaFX Platform.exit() 函数的作用,因为 TornadoFX 只是 JavaFX在其核心,这是 JavaFX 应用程序的最显式关闭。该线程中的一些用户报告说,他们的程序仍会根据他们正在执行的操作而挂起,并建议在他们的关闭例程中添加 System.exit(0);,也就是 Kotlin 中的 exitProcess(0),以确保程序停止运行。

【讨论】:

  • “通常,关闭初级阶段会激活 App 类的 stop() 函数。[...] 但是,我遇到过这种逻辑被破坏并且只有关闭所有程序窗口才有效的实例”。这不是逻辑错误。正如 herehere 所记录的,如果配置为隐式退出,则关闭过程仅在 last 窗口关闭时启动,不一定在主阶段关闭时启动。
  • 如果你想显式停止 JavaFX 运行时,那么你需要调用Platform#exit()Application#stop() 方法只是一个生命周期方法,在适当的时候被调用;它不会激活生命周期的那一部分,可能永远不应该手动调用。
  • @Slaw 似乎不对。我制作了仅在关闭主舞台窗口时调用 TornadoFX App.stop() 函数的程序,即使还有其他没有所有者的窗口打开。
  • 然后出现了问题,可能是 JavaFX 本身的错误,因为这不是记录在案的情况。就个人而言,我从未遇到过这个问题。
  • @Slaw 我认为您将 JavaFX 的 Application#stop() 与 TornadoFX 的 App#stop() 混淆了。
猜你喜欢
  • 1970-01-01
  • 2011-09-19
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 2012-04-17
相关资源
最近更新 更多