Scala Swing脚本不起作用

时间:2012-08-23 18:31:20

标签: swing scala

我刚开始学习Scala,作为整个过程的一部分,我一直在尝试编写一些使用Swing的简单脚本。

这是一个非常精简的例子,展示了我所看到的问题。

SimpleSwingApp:

import scala.swing._
object SimpleSwingApp extends SimpleSwingApplication {
  def top = new MainFrame {
    println ("Starting")
    title = "First Swing App"
    contents = new Button { text = "Click me" }
  }
}

当我通过Eclipse Scala IDE作为Scala应用程序运行脚本时,一切都按预期工作。我将预期的“Starting”文本打印到Eclipse控制台,弹出小GUI并等待点击。

当我尝试从命令行运行它作为脚本时,我什么都没得到。

> scala SimpleSwingApp.scala

没有错误消息,没有“正在启动”,没有GUI。

那是怎么回事,我怎样才能实现我想要的结果(即从命令行启动Scala GUI脚本)?

2 个答案:

答案 0 :(得分:4)

问题是Scala脚本运行器正在寻找脚本文件中的main方法,但它找不到。

找不到它的原因是因为你从SimpleSwingApplication继承main,所以你的脚本文件中没有main方法。

您可以通过向脚本添加一个立即调用super.main的main方法来解决此问题,如下所示:

import scala.swing._
object SimpleSwingApp extends SimpleSwingApplication {

  override def main(args: Array[String]) = super.main(args)

  def top = new MainFrame {
    println("Starting")
    title = "First Swing App"
    contents = new Button { text = "Click me" }
  }
}

现在,脚本不会在Scala IDE中引发错误,可以通过调用

来执行
scala SimpleSwingApp.scala 

而不是美学

scala -i SimpleSwingApp.scala -e "SimpleSwingApp.main(args)"

答案 1 :(得分:2)

如果要从命令行运行它,请在文件底部添加对main的显式调用:

SimpleSwingApp.main(Array())

如果先用scalac编译它,然后运行,它将在没有显式调用main的情况下工作。