Tornadofx应用程序未启动

问题描述 投票:0回答:1

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

感谢您的任何帮助。

javafx-8 tornadofx
1个回答
0
投票

TornadoFX插件生成的gradle配置已过时,存在许多问题。不仅因为为kotlin和tornadofx选择了较旧的版本,而且不建议使用gradle的kotlin应用程序使用buildscript方法。另外,gradle版本非常旧,必须进行更新才能与较新的Java版本一起使用。

要从TornadoFX向导和Java 8创建的演示应用程序开始获取运行的版本,请执行以下操作:

  1. 请确保您具有包含JavaFX的Java 8 JDK。大多数开放式JDK(例如“采用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插件产生的代码使用Windows新行“ \ r \ n”,而“ sh”解释器无法处理。在Linux上,如果未安装dos2unix,则可以使用dos2unix命令或sed:sed -i 's/\x0D$//' gradlew
  4. 使用以下代码编辑build.gradle。这是构建和运行演示应用程序的最简单配置。
  5. 执行gradlew脚本以构建并运行Mac / Linux:./gradlew runWindows:gradlew.bat run
  6. 更新包装器是一个好主意。Mac / Linux:./gradlew wrapperWindows:gradlew.bat wrapper
  7. 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+版本有一些陷阱,但是您应该能够在其他问题中找到这些答案。

© www.soinside.com 2019 - 2024. All rights reserved.