2

我开始学习 Scala,我很困惑。我可以在没有“扩展 SimpleSwingApplication”或“SimpleGUIApplication”的情况下创建 GUI,还是可以创建 GUI?我尝试这样做:

import scala.swing._

object Main {
def main(args:Array[String]): Unit = {
    val frame = new Frame   {title = "test GUI"}
    val button = new Button {text = "test button"}
    val uslPanel = new BoxPanel(Orientation.Vertical) {
        contents += button
        }
    //listenTo(button)

    frame.contents_=(uslPanel)
    frame.visible_=(true)
    }
}

它有效,但如果只评论“listenTo(botton)”。如何在没有“扩展 SimpleGui ... 等”的情况下使用“listenTo(...)”。

4

1 回答 1

2

Swing 应用程序特性给你的两件事。(1) 他们将初始代码推迟到事件调度线程(参见Swing 的线程策略,也在这里)。(2) 他们继承了为您提供您现在缺少Reactor的方法的特征。listenTo

我认为您应该只混合SwingApplication应用程序特征,这是最简单的。否则,您可以手动执行以下操作:

import scala.swing._

object Main {
  def main(args: Array[String]) {
    Swing.onEDT(initGUI) // Scala equivalent of Java's SwingUtilities.invokeLater
  }

  def initGUI() {
    val frame  = new Frame  { title = "test GUI"    }
    val button = new Button { text  = "test button" }
    val uslPanel = new BoxPanel(Orientation.Vertical) {
      contents += button
    }
    val r = new Reactor {}
    r.listenTo(button)
    r.reactions += {
      case event.ButtonClicked(_) => println("Clicked")
    }

    frame.contents = uslPanel
    frame.visible  = true  // or use `frame.open()`
  }
}

请注意,Scala-Swing 中的每个小部件都继承Reactor,因此您经常会发现这种样式:

    val button = new Button {
      text = "test button"
      listenTo(this) // `listenTo` is defined on Button because Button is a Reactor
      reactions += { // `reactions` as well
        case event.ButtonClicked(_) => println("Clicked")
      }
    }
于 2013-06-30T11:28:49.847 回答