在下面的最小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
工作?
答案 0 :(得分:2)
您在swing.Window
上调用的方法是:
def close() { peer setVisible false }
这显然不是你可能会想到的。
答案 1 :(得分:0)
或者,您可以使用 GUI.quit()
。