如何在scala swing中断窗口关闭机制

时间:2011-07-04 14:05:21

标签: swing scala window savefiledialog

我正在使用scala swing中的SimpleSwingApplication特征构建一个GUI。 我想要做的是提供一个关闭机制,询问用户(是,否,取消),如果他还没有保存文件。如果用户点击取消,则Application不应该关闭。但到目前为止我使用MainFrame.closecloseOperation尝试的所有内容均无效。

那么Scala Swing是如何完成的?

我在使用Scala 2.9。

提前致谢。

4 个答案:

答案 0 :(得分:5)

与霍华德建议的差异略有不同

import scala.swing._

object GUI extends SimpleGUIApplication {
  def top = new Frame {
    title="Test"

    import javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE
    peer.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE)

    override def closeOperation() { showCloseDialog() }

    private def showCloseDialog() {
      Dialog.showConfirmation(parent = null,
        title = "Exit",
        message = "Are you sure you want to quit?"
      ) match {
        case Dialog.Result.Ok => exit(0)
        case _ => ()
      }
    }
  }
}

通过使用DO_NOTHING_ON_CLOSE,您有机会定义scala框架收到WindowEvent.WINDOW_CLOSING事件时应该执行的操作。当scala框架收到WINDOW_CLOSING事件时,它会通过调用closeOperation做出反应。因此,要在用户尝试关闭框架时显示对话框,只需覆盖closeOperation并实现所需的行为即可。

答案 1 :(得分:3)

这个怎么样:

import swing._
import Dialog._

object Test extends SimpleSwingApplication { 
  def top = new MainFrame { 
    contents = new Button("Hi")

    override def closeOperation { 
      visible = true
      if(showConfirmation(message = "exit?") == Result.Ok) super.closeOperation  
    }
  }
}

答案 2 :(得分:1)

我对scala swing并不熟悉,但我在一些旧的测试程序中找到了这段代码:

object GUI extends SimpleGUIApplication {
  def top = new Frame {
    title="Test"
    peer.setDefaultCloseOperation(0)

    reactions += {
      case WindowClosing(_) => {
        println("Closing it?")
        val r = JOptionPane.showConfirmDialog(null, "Exit?")
        if (r == 0) sys.exit(0)
      }
    }
  }
}

答案 3 :(得分:0)

这就是我想做的事情;调用super.closeOperation并没有关闭框架。我会在评论中说,但我还没有被允许。

object FrameCloseStarter extends App {
  val mainWindow = new MainWindow()
  mainWindow.main(args)
}

class MainWindow extends SimpleSwingApplication {
  def top = new MainFrame {
    title = "MainFrame"
    preferredSize = new Dimension(500, 500)
    pack()
    open()

    def frame = new Frame {
      title = "Frame"
      preferredSize = new Dimension(500, 500)
      location = new Point(500,500)
      pack()

      peer.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE)

      override def closeOperation() = {
        println("Closing")
        if (Dialog.showConfirmation(message = "exit?") == Result.Ok) {
          peer.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE)
          close()
        }
      }
    }
    frame.open()
  }
}