尝试将JavaFX与Scala一起使用;得到“无法构造应用程序实例:类javaFXTest.Tests $”

时间:2015-02-03 01:29:04

标签: scala javafx

我将Oracle提供的一个简单的HelloWorld应用程序翻译成了Scala(http://docs.oracle.com/javase/8/javafx/get-started-tutorial/hello_world.htm)。

它编译,但在运行它时会给出上面的RunTime异常。我通过Google查看了此错误的其他两篇帖子,似乎都没有解决我的问题:

  • One说我必须在扩展Application时提供无参数构造函数,但Scala会自动创建它。我尝试明确地创建一个,但我得到了预期的"模糊的发生"错误。
  • other one表示扩展应用程序的类必须是公开的,但同样,默认情况下,这不应该是一个问题public

如果我将object Tests extends Application更改为class Tests extends Application,Eclipse就无法找到"入口点,并给我错误"选择不包含主要类型"。问题是什么?我希望它不是兼容性问题。

我最近(一个月或两个月前)下载了Scala和Java,所以我应该拥有每个版本的最新版本。

这里的任何提示都将不胜感激。

package javaFXTest

import javafx._
    import application.Application
    import stage.Stage
    import scene.Scene 
    import scene.control.Button
    import scene.layout.StackPane
    import event.ActionEvent
    import event.EventHandler

object Tests extends Application {

    val buttonPressHandler = new EventHandler[ActionEvent] {
        def handle(event: ActionEvent) = {
            println { event }
        }
    }

    //Main entry point
    def start(primaryStage: Stage) = {
        val button = new Button

        button setText "Hello World!"

        button setOnAction buttonPressHandler

        val root = new StackPane

        root.getChildren.add(button)

        val scene = new Scene(root, 300, 300)

        primaryStage setTitle "Hello World!"
        primaryStage setScene scene
        primaryStage.show()


    }

    def main(args: Array[String]) = {
        // `:_*` turns a scala array into a java vararg
        Application launch (args:_*)
    }

我刚发布后发现,因为我使用的是object,因此无法初始化,也不会有构造函数(哎呀。我以前的构造函数测试是当我尝试使用class代替object时)。所以现在的问题是,为什么Eclipse不能弄清楚如何运行上面的代码?     }

1 个答案:

答案 0 :(得分:1)

感谢this answer,我明白了。 需要注意的关键事项是:

  • 扩展Application的类必须是一个类,而不是一个对象(duh,回想起来)
  • main放入同名的同伴对象
  • Application launch (args:_*)必须为Application.launch(classOf[Tests],args:_*)(其中Tests =您的班级。)

最后,正确启动:

package javaFXTest

import javafx._
    import application.Application
    import stage.Stage
    import scene.Scene 
    import scene.control.Button
    import scene.layout.StackPane
    import event.ActionEvent
    import event.EventHandler


class Tests extends Application {

    val buttonPressHandler = new EventHandler[ActionEvent] {
        def handle(event: ActionEvent) = {
            println { event }
        }
    }

    //Main entry point
    def start(primaryStage: Stage) = {
        val button = new Button

        button setText "Hello World!"

        button setOnAction buttonPressHandler

        val root = new StackPane

        root.getChildren.add(button)

        val scene = new Scene(root, 300, 300)

        primaryStage setTitle "Hello World!"
        primaryStage setScene scene
        primaryStage.show()


    }

}

object Tests {

    def main(args: Array[String]) = {
        // `:_*` turns a scala array into a java vararg
        Application.launch(classOf[Tests],args:_*)
    }

}

希望这有帮助。