2011-07-04 9 views
6

Buduję GUI z cechą SimpleSwingApplication w scala swing. To, co chcę zrobić, to zapewnić mechanizm zamykania, który pyta użytkownika (Tak, Nie, Anuluj), jeśli jeszcze nie zapisał dokumentu. Jeśli użytkownik trafi Anuluj, Application nie powinien się zamykać. Ale wszystko, co próbowałem do tej pory z MainFrame.close i closeOperation nie działa.Jak przerywać mechanizm zamykania okna w scala swing

Jak to się dzieje w Scala Swing?

Jestem na Scali 2.9.

Z góry dziękuję.

Odpowiedz

5

nieco innej odmianie od co Howard zaproponował

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

Korzystając DO_NOTHING_ON_CLOSE cię mają szansę określić, co należy zrobić, gdy zdarzenie WindowEvent.WINDOW_CLOSING zostanie odebrane przez ramkę scala. Gdy ramka scala odbiera zdarzenie WINDOW_CLOSING, reaguje, wywołując closeOperation. Dlatego, aby wyświetlić okno dialogowe, gdy użytkownik próbuje zamknąć ramkę, wystarczy przesłonić closeOperation i zaimplementować pożądane zachowanie.

+0

Dziękuję. Po usunięciu deprecjacji zrobiło to lewę. – man

+0

cieszę się, że pomogło! –

1

nie jestem bardzo obeznany z scala huśtawka ale znalazłem ten kod w niektórych z moich starych programów testowych:

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

Nie jestem pewien: czy "sys.exit (0)" jest normalne w tym celu? Na pierwszy rzut oka wydaje się zbyt ciężki, ale mogę się mylić. – Suma

3

Co o tym:

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

Niestety to nie działa (przynajmniej nie wtedy, gdy jest to MainFrame), ponieważ okno dialogowe potwierdzenia pojawia się dopiero wtedy, gdy okno główne zniknęło. – sambe

0

to robi to, co chciałem zrobić; Wywołanie super.closeOperation nie zamknęło ramki. Powiedziałbym to właśnie w komentarzu, ale nie jestem jeszcze dozwolony.

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() 
    } 
} 
Powiązane problemy