【问题标题】:Closing a Scala swing frame关闭 Scala 摆动框架
【发布时间】:2012-01-21 10:25:10
【问题描述】:

我在关闭 Scala 摆动框架时遇到问题。这是我的退出按钮的代码

val buttonExit = new Button {
  text = "Exit"
  action = Action("Exit") {
    WorldActor.run(false)
    closer
  }
}

closer函数定义为:

def closer (){
  top.close
}

其中 top 是 MainFrame。每次我尝试关闭时,它都会暂停并停止响应。

【问题讨论】:

  • WorldActor 是 scala Actor 吗?

标签: scala action scala-swing


【解决方案1】:

我不擅长scala.swing._,但我认为如下:

top 是 MainFrame
MainFrame如何定义?

如果你定义为:

def top = new MainFrame { ... }

还有如下代码:

val a = top
val b = top

产生两个不同的实例。

所以b.close 不会关闭a
反之亦然,即a.close 不会关闭b

【讨论】:

    【解决方案2】:

    看来你可以打电话了

    dispose() 
    

    在框架上。

    disposescala.swing.Window 上实现,因此适用于框架和对话框。

    调用dispose 会关闭(以可恢复的方式,使用packvisible = true 重新打开)额外的帧并终止应用程序,如果在最后一个帧上调用。

    在调用 System.exit 之前提供的任何关闭代码的任何 Frame 调用 quit() 上终止应用程序。

    这里有一个快速的技巧来说明

    import swing._
    
    object SwingThing extends SimpleSwingApplication {
      def top = new MainFrame {frame =>
        val sf = new Frame {secondFrame =>
          title   = "Secondary Frame"
          visible = true
          contents = new FlowPanel {
            contents += new Button(Action("Close Me") {secondFrame.dispose()})
            contents += new Button(Action("Exit")     {quit()})
          }
        }
        val recoverBtn = new Button(Action("Recover")  {sf.pack(); sf.visible = true})
        val closeBtn   = new Button(Action("Close Me") {frame.dispose()})
        val exitBtn    = new Button(Action("Exit")     {quit()})
    
        contents = new FlowPanel {
          contents += recoverBtn
          contents += closeBtn
          contents += exitBtn
        }
      }
    }
    

    【讨论】:

      【解决方案3】:

      我不是 Scala 方面的专家,但我做过一些 Java swing 开发。尝试使用

      我觉得

      WorldActor.run(false)
      

      暂停程序,尝试删除它,也尝试添加System.exit(0)

      def closer(){
          exit(0) //Java's System.exit(0) ?
      }
      

      或者可以将System.exit(0) 放在top.close 之后。

      另外,您是否将默认关闭操作设置为不执行任何操作?

      peer.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE)
      

      【讨论】:

      • 在哪里以及如何设置 clasa 中的默认关闭操作。你知道吗?
      • 您在 JFrame (MainFrame?) 中执行此操作。只需在构造函数代码中输入setDefaultCloseOperation(EXIT_ON_CLOSE);。确保您已导入 JFrame._;。有关示例,请参见 this