2012-08-23 156 views
3

我刚开始学习Scala,作为该过程的一部分,我一直在尝试编写一些使用Swing的简单脚本。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 IDE斯卡拉将脚本作为斯卡拉申请,按预期工作的一切。我将预期的“开始”文本打印到Eclipse控制台,并且弹出小GUI并等待点击。

当我尝试从命令行将其作为脚本运行时,我什么也没有得到。

> scala SimpleSwingApp.scala 

没有错误信息,没有“开始”,没有GUI。

那么发生了什么,我该如何实现我想要的结果(即从命令行启动Scala GUI脚本)?

回答

4

问题是Scala脚本运行器正在脚本文件中寻找主要方法,但它没有找到它。

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

可以解决该问题通过增加一个main方法将你的脚本调用立即super.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" } 
    } 
} 

现在,该脚本将不会在斯卡拉IDE引发错误,并它可以通过调用

scala SimpleSwingApp.scala 

,而不是更少的审美

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

这是有道理的。谢谢! – HarryM

2

如果你想在命令行中运行它,在文件的底部的显式调用添加到主:

SimpleSwingApp.main(Array()) 

如果编译这个与scalac第一,然后再运行,它会不工作明确地调用main。

+0

感谢您执行回答。这确实有效。不幸的是,它在Eclipse的Scala IDE中引发了一个错误。 找到解决方案,这导致我[this](http://stackoverflow.com/a/7945379/1620605)答案,它解决了IDE错误。 本质上讲,如果我把我的脚本与 _scala -i SimpleSwingApp.scala -e “SimpleSwingApp.main(参数)” _ 它的工作原理。 – HarryM