Как прервать механизм закрытия окна в качели скала - PullRequest
6 голосов
/ 04 июля 2011

Я строю графический интерфейс с чертой SimpleSwingApplication в колебании скалы.Я хочу предоставить механизм закрытия, который спрашивает пользователя (да, нет, отмена), если он еще не сохранил документ.Если пользователь нажимает кнопку Отмена, Application не должен закрываться.Но все, что я до сих пор пробовал с MainFrame.close и closeOperation, не сработало.

Так как же это сделать в Scala Swing?

Я на Scala 2.9.

Заранее спасибо.

Ответы [ 4 ]

5 голосов
/ 04 июля 2011

Немного отличается от того, что предложил Говард

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 и реализовать желаемое поведение.

3 голосов
/ 09 июля 2011

Что по этому поводу:

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  
    }
  }
}
1 голос
/ 04 июля 2011

Я не очень знаком с 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)
      }
    }
  }
}
0 голосов
/ 18 мая 2016

Это делает то, что я хотел сделать;вызов 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()
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...