2011-07-04 8 views
6

Estoy construyendo una GUI con el rasgo SimpleSwingApplication en scala swing. Lo que quiero hacer es proporcionar un mecanismo de cierre, que le pregunte al usuario (Sí, No, Cancelar) si aún no ha guardado el documento. Si el usuario pulsa Cancelar, el Application no se debe cerrar. Pero todo lo que intenté hasta ahora con MainFrame.close y closeOperation no funcionó.Cómo interrumpir el mecanismo de cierre de la ventana en scala swing

Entonces, ¿cómo se hace esto en Scala Swing?

Estoy en Scala 2.9.

Gracias de antemano.

Respuesta

5

variación ligeramente diferente de lo que Howard sugirió

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 _ =>() 
     } 
    } 
    } 
} 

Mediante el uso de DO_NOTHING_ON_CLOSE se se les da la oportunidad de definir qué se debe hacer cuando el marco scala recibe un evento WindowEvent.WINDOW_CLOSING. Cuando un marco scala recibe un evento WINDOW_CLOSING, reacciona llamando al closeOperation. Por lo tanto, para mostrar un cuadro de diálogo cuando el usuario intenta cerrar el cuadro, es suficiente para anular closeOperation e implementar el comportamiento deseado.

+0

Gracias. Después de eliminar las deprecaciones, esto funcionó. – man

+0

¡me alegro de que haya ayudado! –

1

no estoy muy familiarizado con el swing Scala, pero me encontré con este código en algunos de mis viejos programas de prueba:

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) 
     } 
    } 
    } 
} 
+0

No estoy seguro: is 'sys.exit (0)' normal para este propósito? A primera vista parece demasiado pesado, pero puedo estar equivocado. – Suma

3

Qué tal esto:

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 
    } 
    } 
} 
+0

Desafortunadamente, esto no funciona (al menos no cuando se trata de un MainFrame), porque el diálogo de confirmación solo aparece después de que la ventana principal ya ha desaparecido. – sambe

0

Esto hace lo que quería hacer; llamar a super.closeOperation no cerró el marco. Lo hubiera dicho en un comentario, pero aún no estoy autorizado.

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() 
    } 
} 
Cuestiones relacionadas