为什么主框架关闭时scala摆动app退出?

时间:2013-12-19 14:50:57

标签: swing scala

在下面的最小Scala Swing应用程序中,如果我选择File-> Exit(调用sys.exit)或File-> Quit(调用SimpleSwingApplication.quit),则应用程序退出。如果我选择File-> Close(调用Frame.close),则窗口关闭但应用程序不会退出(例如,当使用java -jar myexample.jar运行时,它不会返回到提示符 - 我必须^ C来杀死它。)

import scala.swing._
import swing.event.{Key,WindowClosed,WindowClosing}

object GUI extends SimpleSwingApplication {
  def top = new Frame {
    import javax.swing.WindowConstants.EXIT_ON_CLOSE
    peer.setDefaultCloseOperation(EXIT_ON_CLOSE)

    menuBar = new MenuBar {
      contents += new Menu("File") {
        mnemonic = Key.F
        contents += new MenuItem(Action("Exit") { sys.exit(0) }) { mnemonic = Key.X }
        contents += new MenuItem(Action("Close") { close() }) { mnemonic = Key.C }
        contents += new MenuItem(Action("Quit") { quit }) { mnemonic = Key.Q }
      }
    }
  }
}

我尝试了一些不同的事情,都有相同的行为:

  • 使用MainFrame代替Frame
  • 向与reactions匹配的WindowClosing添加处理程序,并从那里调用sys.exit
    • Frame子类(此处未显示)和
    • 添加了反应
    • SimpleSwingApplication
  • EXIT_ON_CLOSE似乎应该可以胜任这项工作,但不管它是否存在并不重要
  • 将默认关闭操作设置为DISPOSE_ON_CLOSE
  • 覆盖Frame.closeOperation以致电sys.exit,但这似乎根本没有被调用(我在那里添加了一个打印,并且它不会导致任何输出)

this answer的启发,如果我更改文件 - >关闭处理程序以调用dispose而不是close,则该应用会退出。 docs for MainFrame say

  

关闭框架并在关闭时退出应用程序。

这使我认为close应该有用。

为什么我必须在此处拨打dispose而不是close为什么不EXIT_ON_CLOSE或覆盖closeOperation工作?

2 个答案:

答案 0 :(得分:2)

您在swing.Window上调用的方法是:

def close() { peer setVisible false }

这显然不是你可能会想到的。

答案 1 :(得分:0)

或者,您可以使用 GUI.quit()