2

Scala スイング フレームを閉じるのに問題があります。これが私の終了ボタンのコードです

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

クローザー関数は次のように定義されます。

def closer (){
  top.close
}

top はメインフレームです。閉じようとするたびに、サスペンドして応答を停止します。

4

3 に答える 3

5

電話できるらしい

dispose() 

フレームに。

disposeに実装されてscala.swing.Windowいるため、フレームとダイアログに適用されます。

最後のフレームで呼び出された場合、呼び出すと追加のフレームdisposeが閉じられ (回復可能な方法で および を使用packして再度開くことができます)、アプリケーションが終了します。visible = true

quit()System.exit を呼び出す前に提供されたシャットダウン コードを呼び出すFrame 呼び出しでアプリを終了するには。

これは説明するための簡単なハックです

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
    }
  }
}
于 2011-12-15T22:48:07.283 に答える
1

私は Scala の専門家ではありませんが、Java のスイング開発を行ったことがあります。使ってみて

おもう

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)
于 2011-12-15T18:46:26.143 に答える
0

私は熟練していませんscala.swing._が、次のように考えています。

メインフレームは
どこにありますか? メインフレームを定義する方法は?

次のように定義した場合:

def top = new MainFrame { ... }

そして、次のコード:

val a = top
val b = top

2 つの異なるインスタンスを生成します。

だからb.close閉じませんa
逆もまた同様です。つまりa.close、閉じませんb

于 2012-01-26T14:21:48.233 に答える