尝试将 JavaFX 与 Scala 结合使用;获得 "Unable to construct Application instance: class javaFXTest.Tests$"
Trying to use JavaFX with Scala; getting "Unable to construct Application instance: class javaFXTest.Tests$"
我将 Oracle 提供的一个简单的 HelloWorld 应用程序翻译成 Scala (http://docs.oracle.com/javase/8/javafx/get-started-tutorial/hello_world.htm)。
它可以编译,但是当我 运行 它时会出现上述运行时异常。我通过 Google 查看了关于此错误的其他 2 个帖子,但似乎都没有解决我的问题:
- One 说我在扩展
Application
时必须提供一个无参数的构造函数,但 Scala 会自动创建它。我尝试明确创建一个,但出现了预期的 "ambiguous occurrence" 错误。
- other one 表示 class 扩展应用程序必须是 public,但同样,这应该不是问题,因为 class 默认情况下
public
如果我将 object Tests extends Application
更改为 class Tests extends Application
,Eclipse 无法 "find" 入口点,并给我错误 "Selection does not contain a main type"。有什么问题?我希望这不是兼容性问题。
我最近(一两个月前)下载了 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 无法弄清楚如何 运行 上面的代码呢?
}
多亏了 this answer,我才开始工作。
关键注意事项:
- class 扩展应用程序必须是 class,而不是对象(呃,回想起来)
- 将
main
放入同名的伴随对象中
Application launch (args:_*)
需要 Application.launch(classOf[Tests],args:_*)
(其中 Tests
= 您的 class)。
最终,正确启动:
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:_*)
}
}
希望这对您有所帮助。
我将 Oracle 提供的一个简单的 HelloWorld 应用程序翻译成 Scala (http://docs.oracle.com/javase/8/javafx/get-started-tutorial/hello_world.htm)。
它可以编译,但是当我 运行 它时会出现上述运行时异常。我通过 Google 查看了关于此错误的其他 2 个帖子,但似乎都没有解决我的问题:
- One 说我在扩展
Application
时必须提供一个无参数的构造函数,但 Scala 会自动创建它。我尝试明确创建一个,但出现了预期的 "ambiguous occurrence" 错误。 - other one 表示 class 扩展应用程序必须是 public,但同样,这应该不是问题,因为 class 默认情况下
public
如果我将 object Tests extends Application
更改为 class Tests extends Application
,Eclipse 无法 "find" 入口点,并给我错误 "Selection does not contain a main type"。有什么问题?我希望这不是兼容性问题。
我最近(一两个月前)下载了 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 无法弄清楚如何 运行 上面的代码呢?
}
多亏了 this answer,我才开始工作。 关键注意事项:
- class 扩展应用程序必须是 class,而不是对象(呃,回想起来)
- 将
main
放入同名的伴随对象中 Application launch (args:_*)
需要Application.launch(classOf[Tests],args:_*)
(其中Tests
= 您的 class)。
最终,正确启动:
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:_*)
}
}
希望这对您有所帮助。