2011-07-04 21 views
6

Scala hızıyla SimpleSwingApplication özelliğiyle bir GUI oluşturuyorum. Yapmak istediğim, belgeyi henüz kaydetmediyse, kullanıcıdan (Evet, Hayır, İptal) sorulan yakın bir mekanizma sağlamaktır. Kullanıcı İptal İste Application kapanmamalı. Ama şimdiye kadar MainFrame.close ve closeOperation ile denediğim her şey işe yaramadı.Scala salınımında pencere kapatma mekanizması nasıl kesilir?

Peki bu Scala Swing'de nasıl yapılır?

Scala'dayım 2.9.

Şimdiden teşekkürler.

cevap

5

Biraz farklı varyasyon scala çerçevesi tarafından bir WindowEvent.WINDOW_CLOSING olayı alındığında ne yapılması gerektiğini tanımlamak için bir şans verilir. Bir scala çerçevesi bir WINDOW_CLOSING olayını aldığında, closeOperation numaralı telefonu arayarak tepki verir. Bu nedenle, kullanıcı çerçeveyi kapatmaya çalışırken bir diyaloğu görüntülemek için closeOperation'u geçersiz kılmak ve istenen davranışı uygulamak yeterlidir.

+0

Teşekkürler. İhmalleri kaldırdıktan sonra, bu hile yaptı. – man

+0

yardım ettiğine sevindim! –

1

Ben scala salıncak gerçekten aşina değilim ama benim eski test programları bazılarında bu kodu bulundu: Howard sana DO_NOTHING_ON_CLOSE kullanarak

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

önerdi ne

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

Emin değilim: 'sys.exit (0) 'bu amaç için normal midir? İlk bakışta çok ağır görünüyor ama yanılıyor olabilirim. – Suma

3

bu konuda ne:

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

Ne yazık ki bu çalışma (en azından MainFrame olduğunda değil), çünkü ana pencerenin zaten kaybolmasından sonra onay iletişim kutusu görünür. – sambe

0

Bu benim ne yapmak istediğini yapar; super.closeOperation çağrısı çerçeveyi kapatmadı. Bunu bir yorumda söylemeliydim, ama henüz izin vermedim.

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