簡體   English   中英

如何運行基本的 ScalaFX 應用程序?

[英]How do I run a basic ScalaFX application?

我正在嘗試運行一個簡單的 ScalaFX 程序,該程序顯示一個沒有任何內容的窗口。

我可以將程序作為具有所需結果的腳本文件運行,但是當我向程序添加主對象時,它仍然運行但不產生窗口。 我可以編譯非腳本文件,但是如果我嘗試運行它,我會收到以下錯誤:

java.lang.NoClassDefFoundError: scalafx/application/JFXApp$PrimaryStage
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.privateGetMethodRecursive(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at scala.reflect.internal.util.ScalaClassLoader.run(ScalaClassLoader.scala:95)
        at scala.reflect.internal.util.ScalaClassLoader.run$(ScalaClassLoader.scala:91)
        at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:125)
        at scala.tools.nsc.CommonRunner.run(ObjectRunner.scala:22)
        at scala.tools.nsc.CommonRunner.run$(ObjectRunner.scala:21)
        at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:39)
        at scala.tools.nsc.CommonRunner.runAndCatch(ObjectRunner.scala:29)
        at scala.tools.nsc.CommonRunner.runAndCatch$(ObjectRunner.scala:28)
        at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:39)
        at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:66)
        at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:85)
        at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:96)
        at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:101)
        at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
Caused by: java.lang.ClassNotFoundException: scalafx.application.JFXApp$PrimaryStage
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 19 more

我究竟做錯了什么?


    // Script file that works
    import scalafx.application.JFXApp

    val app = new JFXApp {
        stage = new JFXApp.PrimaryStage {
            title = "First GUI"
        }
    }

    app.main(args)


    // I run this in powershell with the following command:
    //scala -cp .\scalafx.jar .\program.scala


    // Program (non-script file) that doesn't give any errors when compiled but won't run. I can run this as a script file, but no window appears.

    import scalafx.application.JFXApp

    object Window extends JFXApp {
        stage = new JFXApp.PrimaryStage {
            title = "First GUI"
        }
    }

    // I compile this in powershell with the following command:
    //scalac -cp .\scalafx.jar .\program.scala
    // And run with this command:
    // scala Window

編譯后的程序為類文件生成以下名稱(如果有幫助的話):

Window$$anon$1.class, Window$.class, Window$delayedInit$body.class, Window.class,

該異常表明JVM 運行時無法找到ScalaFX JAR文件。 (也就是說,當程序運行時, ScalaFX JAR文件不在類路徑上。)

嘗試使用此命令:

scala -cp .\scalafx.jar Window

更新:我只是猜測這對您有用,因為您在成功運行腳本並編譯源文件時使用了相同的類路徑參數。 (請注意,所有必需的JAR文件都必須在編譯時運行時都存在。)

但是,更強大的解決方案是使用SBT來構建和運行您的應用程序(腳本用例對於快速和骯臟的實用程序創建以外的任何事情都不理想)。

SBT與之前的Maven一樣,在您的應用程序的源文件上強加了一個結構,這立即使任何其他SBT / Scala開發人員都能理解該項目。 它還將下載並提供您需要的任何依賴庫、工具和插件。 (有許多公共和私人工件儲存器中,主要的一個是Maven的中央資料庫。SBT會很樂意用這個,你會從那里找到可用ScalaFX。)

為了演示SBT如何簡化項目開發,運行應用程序所需要做的就是向它發出命令(從項目的根目錄):

sbt run <project-name>

它將下載所有必需的存儲庫,如果它還沒有這樣做,編譯任何更改的源,並一步運行應用程序 - 它會為您處理類路徑。

甚至還有用於創建本機安裝程序的SBT插件,以便您可以像任何商業應用程序一樣安裝、運行和卸載您的代碼。

您可以通過鏈接找到SBT入門指南

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM