2012-08-23 195 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