我正在使用scala swing中的SimpleSwingApplication
特征构建一个GUI。
我想要做的是提供一个关闭机制,询问用户(是,否,取消),如果他还没有保存文件。如果用户点击取消,则Application
不应该关闭。但到目前为止我使用MainFrame.close
和closeOperation
尝试的所有内容均无效。
那么Scala Swing是如何完成的?
我在使用Scala 2.9。
提前致谢。
答案 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()
}
}