2
在以下最小的Scala Swing應用程序中,如果選擇File-> Exit(其調用sys.exit
)或File-> Quit(調用SimpleSwingApplication.quit
),則應用程序退出。如果我選擇文件 - >關閉(它調用Frame.close
),那麼窗口關閉,但應用程序不會退出(例如,使用java -jar myexample.jar
運行時它不會返回到提示 - 我必須^ C殺死它)。當主框架關閉時,爲什麼scala無法退出應用程序?
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
的工作?
那麼,這個答案對我來說太簡單了。你能否爲我這樣的緩慢的人詳細說明一下? Thx –
@MartinQuinson即,'close'方法不是'MainFrame'上的文檔的意思。使用'quit',也許在''shutdown'調用'frame.dispose'。第一次學習scala時我玩過scala-swing,但我不使用它。 –