我将Oracle提供的一个简单的HelloWorld应用程序翻译成了Scala(http://docs.oracle.com/javase/8/javafx/get-started-tutorial/hello_world.htm)。
它编译,但在运行它时会给出上面的RunTime异常。我通过Google查看了此错误的其他两篇帖子,似乎都没有解决我的问题:
Application
时提供无参数构造函数,但Scala会自动创建它。我尝试明确地创建一个,但我得到了预期的"模糊的发生"错误。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不能弄清楚如何运行上面的代码?
}
答案 0 :(得分:1)
感谢this answer,我明白了。 需要注意的关键事项是:
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:_*)
}
}
希望这有帮助。