Закрытие качели Scala - PullRequest
       15

Закрытие качели Scala

2 голосов
/ 15 декабря 2011

У меня проблема с закрытием поворотной рамы Scala.Вот код для моей кнопки выхода

val buttonExit = new Button {
  text = "Exit"
  action = Action("Exit") {
    WorldActor.run(false)
    closer
  }
}

Функция сближения определена как:

def closer (){
  top.close
}

, где top - основной блок.Каждый раз, когда я пытаюсь закрыть, он просто приостанавливается и перестает отвечать.

Ответы [ 3 ]

5 голосов
/ 16 декабря 2011

Кажется, вы можете позвонить

dispose() 

на раме.

dispose реализован на scala.swing.Window, поэтому применяется к фреймам и диалогам.

Вызов dispose закрывает (восстанавливаемым способом, используя pack и visible = true для повторного открытия) дополнительные кадры и завершает приложение, если вызывается в последнем кадре.

Завершение работы приложения при любом вызове Frame quit(), который вызывает любой код отключения, предоставленный перед вызовом System.exit.

Вот быстрый взлом, чтобы проиллюстрировать

import swing._

object SwingThing extends SimpleSwingApplication {
  def top = new MainFrame {frame =>
    val sf = new Frame {secondFrame =>
      title   = "Secondary Frame"
      visible = true
      contents = new FlowPanel {
        contents += new Button(Action("Close Me") {secondFrame.dispose()})
        contents += new Button(Action("Exit")     {quit()})
      }
    }
    val recoverBtn = new Button(Action("Recover")  {sf.pack(); sf.visible = true})
    val closeBtn   = new Button(Action("Close Me") {frame.dispose()})
    val exitBtn    = new Button(Action("Exit")     {quit()})

    contents = new FlowPanel {
      contents += recoverBtn
      contents += closeBtn
      contents += exitBtn
    }
  }
}
1 голос
/ 15 декабря 2011

Я не эксперт по Scala, но я занимался разработкой Java-свинга.Попробуйте использовать

Я думаю,

WorldActor.run(false)

приостановит программу, попробуйте удалить ее, также попробуйте добавить System.exit(0).

def closer(){
    exit(0) //Java's System.exit(0) ?
}

или, возможно, поставить System.exit(0) послеtop.close.

Кроме того, вы установили операцию закрытия по умолчанию, чтобы ничего не делать?

peer.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE)
0 голосов
/ 26 января 2012

У меня нет опыта в scala.swing._, но я думаю следующее:

, где top - это MainFrame
Как определить MainFrame?

Если вы определите как:

def top = new MainFrame { ... }

И следующий код:

val a = top
val b = top

создаст два разных экземпляра.

То есть b.close не закрывается a.
И наоборот, т.е. a.close не закрывается b.

...