2013-12-19 55 views
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的工作?

回答

2

你在swing.Window調用的方法是:

def close() { peer setVisible false } 

這顯然不是你可能會認爲什麼。

+1

那麼,這個答案對我來說太簡單了。你能否爲我這樣的緩慢的人詳細說明一下? Thx –

+0

@MartinQuinson即,'close'方法不是'MainFrame'上的文檔的意思。使用'quit',也許在''shutdown'調用'frame.dispose'。第一次學習scala時我玩過scala-swing,但我不使用它。 –

相關問題