【问题标题】:Tornadofx application not launchingTornadofx 应用程序未启动
【发布时间】:2020-01-29 00:11:51
【问题描述】:

我是 JavaFX 和 TornadoFX 的新手,但了解 Kotlin。 我正在开发新的桌面应用程序并尝试使用 TornadoFX。 我在 IntelliJ 中安装了 TornadoFX 插件并创建了一个新的 TornadoFX 项目(基于 gradle)。 使用模板代码,当我运行应用程序时出现以下错误:

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)

样式类:

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 我还尝试创建一个新的“应用程序”配置来运行应用程序。

感谢任何帮助。

【问题讨论】:

  • 您使用的是 Oracle JDK 还是 OpenJDK?如果是 OpenJDK,请确保安装 Java 8 兼容版本的 OpenJFX。
  • 我正在使用 Orcale JDK 和 MacOS Mojave
  • 我得到了同样的结果:MacOS、TornadoFX、gradle。只是看不到任何工作结果。

标签: javafx-8 tornadofx


【解决方案1】:

TornadoFX 插件生成的 gradle 配置已经过时并且存在许多问题。不仅因为 kotlin 和 tornadofx 选择了较旧的版本,而且 buildscript 方法已被使用 gradle 的 kotlin 应用程序弃用。此外,gradle 版本相当旧,必须更新才能与较新的 Java 版本一起使用。

要从 TornadoFX 向导和 Java 8 创建的演示应用开始运行构建,请执行以下操作:

  1. 确保您拥有包含 JavaFX 的 Java 8 JDK。大多数开放 JDK,例如 Adopt OpenJDK,都没有。 oracle JDK 8 应该包含 Java FX。对于开放的 JDK,我建议 Zulu 或 Liberica(他们有 raspery pi 的构建)。下载时,请确保选择包含 Java FX 的 JDK。对于 Zulu,您必须选择“JDK FX”,对于 Liberica,您必须选择“Full JDK”。
  2. 编辑 gradle/wrapper/gradle-wrapper.properties 并将 URL 中的 gradle-4.4-bin.zip 更改为 gradle-6.3-bin.zip 版本 6.3 将适用于 JDK 最高版本 14。
  3. 如果在 Mac 或 Linux 上,您必须将 gradlew 脚本转换为使用 unix 行尾。 TornadoFX 插件生成的一个使用“sh”解释器无法处理的 windows 新行“\r\n”。在 linux 上,如果没有安装 dos2unix,可以使用 dos2unix 命令或 sed:sed -i 's/\x0D$//' gradlew
  4. 使用以下代码编辑 build.gradle。这是构建和运行演示应用程序的最简单配置
  5. 执行gradlew脚本构建并运行
    Mac/Linux:./gradlew run
    Windows:gradlew.bat run
  6. 更新包装器是个好主意
    Mac/Linux:./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,因为它从 JDK 9 开始是分开的。

添加到插件部分:

    // 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+ 版本有一些问题,但您应该能够在其他问题中找到这些答案。

【讨论】:

    猜你喜欢
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多