【问题标题】:Trying to use JavaFX with Scala; getting "Unable to construct Application instance: class javaFXTest.Tests$"尝试将 JavaFX 与 Scala 一起使用;得到“无法构造应用程序实例:类 javaFXTest.Tests$”
【发布时间】:2015-04-02 02:48:28
【问题描述】:

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

它可以编译,但在我运行它时会出现上述运行时异常。我通过 Google 查看了关于此错误的其他 2 篇帖子,但似乎都没有解决我的问题:

  • One 说我必须在扩展 Application 时提供一个无参数的构造函数,但 Scala 会自动创建它。我尝试显式创建一个,但我得到了预期的“模棱两可的发生”错误。
  • other one 表示扩展 Application 的类必须是公共的,但同样,这不应该是一个问题,因为默认类是 public

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

我最近(一个月或 2 个月前)下载了 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,所以它无法初始化,并且不会有构造函数(哎呀。我之前的构造函数测试是当我尝试使用 classobject)。所以现在的问题是,为什么 Eclipse 不能弄清楚如何运行上面的代码? }

【问题讨论】:

  • 为了让事情变得更简单ScalaFX 存在,而且自从我使用它以来似乎已经走了很长一段路。
  • 你知道如何安装它的任何指南吗?我今天早上花了最后 4 个小时尝试安装它,在安装了 Git 和 SBT(应该有帮助)之后,我更加困惑了。

标签: scala javafx


【解决方案1】:

感谢this answer,我得到了它的工作。 需要注意的关键事项:

  • 扩展 Application 的类必须是类,而不是对象(呃,回想起来)
  • 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:_*)
    }

}

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2012-01-17
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    相关资源
    最近更新 更多