我是JavaFX和TornadoFX的新手,但了解Kotlin。我正在开发新的桌面应用程序,正在尝试TornadoFX。我在IntelliJ中安装了TornadoFX插件,并创建了一个新的TornadoFX项目(基于渐变)。使用模板代码,当我运行应用程序时,出现以下错误:
Jan 28, 2020 4:06:22 PM tornadofx.DefaultErrorHandler uncaughtException
SEVERE: Uncaught error
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:875)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$147(LauncherImpl.java:157)
at com.sun.javafx.application.LauncherImpl$$Lambda$49/458209687.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoSuchMethodError: javafx.stage.Window.getProperties()Ljavafx/collections/ObservableMap;
at tornadofx.FXKt.setAboutToBeShown(FX.kt:663)
at tornadofx.App.start(App.kt:84)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$153(LauncherImpl.java:821)
at com.sun.javafx.application.LauncherImpl$$Lambda$52/707342127.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$166(PlatformImpl.java:323)
at com.sun.javafx.application.PlatformImpl$$Lambda$46/1637506559.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$null$164(PlatformImpl.java:292)
at com.sun.javafx.application.PlatformImpl$$Lambda$48/1602612637.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$165(PlatformImpl.java:291)
at com.sun.javafx.application.PlatformImpl$$Lambda$47/2117255219.run(Unknown Source)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
MyApp类:class MyApp: App(MainView::class, Styles::class)
Styles Class:
class Styles : Stylesheet() {
companion object {
val heading by cssclass()
}
init {
label and heading {
padding = box(10.px)
fontSize = 20.px
fontWeight = FontWeight.BOLD
}
}
}
MainView类:
class MainView : View("Hello TornadoFX") {
override val root = hbox {
label(title) {
addClass(Styles.heading)
}
}
}
我正在使用Java 1.8,Kotlin 1.3和Tornadofx 1.7.17我还尝试通过创建新的“应用程序”配置来运行该应用程序。
感谢您的任何帮助。
TornadoFX插件生成的gradle配置已过时,存在许多问题。不仅因为为kotlin和tornadofx选择了较旧的版本,而且不建议使用gradle的kotlin应用程序使用buildscript方法。另外,gradle版本非常旧,必须进行更新才能与较新的Java版本一起使用。
要从TornadoFX向导和Java 8创建的演示应用程序开始获取运行的版本,请执行以下操作:
sed -i 's/\x0D$//' gradlew
./gradlew run
Windows:gradlew.bat run
./gradlew wrapper
Windows:gradlew.bat wrapper
JDK 8 build.gradle
plugins { // Apply the Kotlin JVM plugin to add support for Kotlin. id 'org.jetbrains.kotlin.jvm' version '1.3.70' // Apply the application plugin to add support for building a CLI application. id 'application' } compileKotlin { kotlinOptions.jvmTarget = "1.8" } repositories { mavenLocal() mavenCentral() maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } } dependencies { // Align versions of all Kotlin components implementation platform('org.jetbrains.kotlin:kotlin-bom') // Use the Kotlin JDK 8 standard library. implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' // Use the tornadofx implementation "no.tornado:tornadofx:1.7.20" } mainClassName = "com.example.demo.app.MyApp"
JDK 9 +
对于JDK 9+,请从上述步骤2开始,并修改build.gradle以下载JavaFX,因为它已从9开始从JDK分离出来。
添加到插件部分:
// Apply the javafx plugin id 'org.openjfx.javafxplugin' version '0.0.8'
然后添加一个javafx部分:
javafx { version = "13" modules = [ 'javafx.controls', 'javafx.fxml' ] }
最后,将tornadofx版本更改为2.0快照
// Use the tornadofx implementation "no.tornado:tornadofx:2.0.0-SNAPSHOT"
此时,演示应用程序应运行。使用TornadoFX运行JDK 9+版本有一些陷阱,但是您应该能够在其他问题中找到这些答案。