2011-07-04 37 views
6

Tôi đang tạo GUI với đặc tính SimpleSwingApplication trong xoay vòng. Điều tôi muốn làm là cung cấp một cơ chế đóng, yêu cầu người dùng (Có, Không, Hủy) nếu anh ta không lưu tài liệu. Nếu người dùng nhấn Hủy, Application sẽ không đóng. Nhưng mọi thứ tôi đã thử cho đến nay với MainFrame.closecloseOperation không hoạt động.Làm thế nào để làm gián đoạn cơ chế đóng cửa sổ trong scala swing

Vậy điều này được thực hiện như thế nào trong Scala Swing?

Tôi đang sử dụng Scala 2.9.

Xin cảm ơn trước.

Trả lời

5

biến Hơi khác với những gì Howard đề nghị

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

Bằng cách sử dụng DO_NOTHING_ON_CLOSE bạn được cho một cơ hội để xác định những gì nên được thực hiện khi một sự kiện WindowEvent.WINDOW_CLOSING được nhận bởi khung scala. Khi khung scala nhận được sự kiện WINDOW_CLOSING, nó sẽ phản ứng bằng cách gọi closeOperation. Do đó, để hiển thị một hộp thoại khi người dùng cố gắng đóng khung, nó đủ để ghi đè lên closeOperation và thực hiện hành vi mong muốn.

+0

Cảm ơn bạn. Sau khi loại bỏ các khoản khấu hao, điều này đã làm các trick. – man

+0

vui vì nó đã giúp! –

1

Tôi không thực sự quen thuộc với swing scala nhưng tôi tìm thấy mã này trong một số chương trình thử nghiệm cũ của tôi:

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

Tôi không chắc chắn: là 'sys.exit (0)' bình thường cho mục đích này? Thoạt nhìn nó có vẻ quá nặng, nhưng tôi có thể sai. – Suma

3

gì về điều này:

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

Thật không may điều này không hoạt động (ít nhất là không khi nó là một MainFrame), bởi vì hộp thoại xác nhận chỉ xuất hiện sau khi cửa sổ chính đã biến mất. – sambe

0

này làm những gì tôi muốn làm; gọi super.closeOperation không đóng khung. Tôi đã chỉ nói rằng trong một bình luận, nhưng tôi chưa được phép.

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() 
    } 
} 
Các vấn đề liên quan