TornadoFX не находит JavaFx

Я пробую свое первое приложение с TornadoFx, поэтому начал с этого кода:

package no.tornado.fxsample.workspace

import javafx.application.Application
import tornadofx.*

fun main(args: Array<String>) = launch<MyApp>(args)

class MyApp: App(MyView::class)

class MyView: View() {
    override val root = VBox()
    init {
        with(root) {
        this += Button("Press Me")
        this += Label("Waiting")
        }
    }
}

но, видимо, он полон ошибок и не может найти JavaFX

My gradle.build is:

// set up the kotlin-gradle plugin
buildscript {
    ext.kotlin_version = '1.1.60'
    repositories {
       mavenLocal()    //    mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

// apply the kotlin-gradle plugin
apply plugin: "kotlin"

// add kotlin-stdlib dependencies.
repositories {
    mavenLocal()  // mavenCentral()
}

dependencies {
    //dependencies from a remote repositor
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile "no.tornado:tornadofx:1.7.12"
}

jar {
    manifest {
        //Define mainClassName as: '[your_namespace].[your_arctifact]Kt'
        attributes ('Main-Class': 'MyAppKt', "Implementation-Title": "Gradle",
                   "Implementation-Version": 1)
    }
    // NEW LINE HERE !!!
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

sourceSets {
    main.kotlin.srcDirs += 'src/kotlin'
    main.resources.srcDirs += 'src/resources'
}

kotlin {
    experimental.coroutines 'enable'
}

compileKotlin {
    kotlinOptions.jvmTarget= 1.8  // optional, Minimum jvmTarget of 1.8 needed since Kotlin 1.1
    kotlinOptions.suppressWarnings = true
}

введите описание изображения здесь


person Hasan A Yousef    schedule 25.11.2017    source источник


Ответы (4)


Может быть, вы используете OpenJDK, в котором по умолчанию нет JavaFX? Я настоятельно рекомендую вам установить Oracle JDK 8.

В вашем коде используется сильно устаревший синтаксис. Поскольку вы новый пользователь, я подозреваю, что у нас есть несколько устаревших образцов кода - не могли бы вы сказать мне, где вы нашли эти примеры?

Вот как это должно теперь быть написано:

class MyView : View() {
    override val root = vbox {
        button("Press me")
        label("Waiting")
    }
}
person Edvin Syse    schedule 25.11.2017
comment
Спасибо, Эдвин, на самом деле я использую последнюю версию ORACLE JDK 1.8.0_144, я исправил, теперь у меня другая ошибка, Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics at myApp.MainKt.main(main.kt) - person Hasan A Yousef; 25.11.2017
comment
Хорошо :) Судя по вашему снимку экрана, ваш код также находится в неправильном пакете и называется MyAppKt, а не `MainKt. В любом случае установите плагин TornadoFX и просто щелкните значок желоба Tornado рядом с экземпляром приложения, чтобы запустить приложение. Он настроит его правильно. - person Edvin Syse; 25.11.2017
comment
Спасибо, я действительно еще не понимаю, что произошло и почему, теперь приложение отлично работает со мной, когда я использую командную строку с MS VS Code, но когда я использую Intellej IDEA, все еще возникают ошибки ?! - person Hasan A Yousef; 25.11.2017
comment
Я опубликовал то, что получил, используя командную строку, по сравнению с тем, что я получил, используя intellij Idea в качестве ответа вместо обновления моего вопроса, пожалуйста, посмотрите. Благодарность - person Hasan A Yousef; 25.11.2017
comment
Я получил старый код от: edvin.gitbooks.io/ tornadofx-guide / content / part1 / - person Hasan A Yousef; 27.11.2017
comment
Объясняется, что это не способ делать это :) Просто чтобы вы понимали, что происходит за крышкой, когда вы используете конструкторы :) - person Edvin Syse; 28.11.2017
comment
Спасибо за разъяснение, перескочил прямо к коду, не читая текста :) - person Hasan A Yousef; 29.11.2017
comment
Я рад, что вы подняли этот вопрос, я обновлю руководство, чтобы показать только лучшие практики :) - person Edvin Syse; 30.11.2017

Это альтернативный вариант, я просто написал его как ответ на случай, если это кому-то интересно. Приведенный ниже код теперь работает со мной, используя command line с MS VS Code:

main.kt:

import javafx.*
import javafx.application.Application
import javafx.scene.control.Button
import javafx.scene.layout.VBox
import tornadofx.*
import javafx.scene.control.Label

class MyApp: App(MyView::class)

class MyView : View() {
    override val root = vbox {
        button("Press me")
        label("Waiting")
    }
}

fun main(args: Array<String>) {
    Application.launch(MyApp::class.java, *args)
}

build.gradle:

// set up the kotlin-gradle plugin
buildscript {
    ext.kotlin_version = '1.1.60'
    repositories {
       mavenLocal()    //    mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

// apply the kotlin-gradle plugin
apply plugin: "kotlin"

// add kotlin-stdlib dependencies.
repositories {
    mavenLocal()  // mavenCentral()
}

dependencies {
    //dependencies from a remote repositor
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile "no.tornado:tornadofx:1.7.12"
}


jar {
    manifest {
        //Define mainClassName as: '[your_namespace].[your_arctifact]Kt'
        attributes ('Main-Class': 'MainKt', "Implementation-Title": "Gradle",
                   "Implementation-Version": 1)
    }
    // NEW LINE HERE !!!
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}


sourceSets {
    main.kotlin.srcDirs += 'src/kotlin'
    main.resources.srcDirs += 'src/resources'
}

kotlin {
    experimental.coroutines 'enable'
}

compileKotlin {
    kotlinOptions.jvmTarget= 1.8  // optional, Minimum jvmTarget of 1.8 needed since Kotlin 1.1
    kotlinOptions.suppressWarnings = true
}

Результат:  введите описание изображения здесь

Но в Intellij IDEA по-прежнему полно ошибок, как показано ниже:  введите описание изображения здесь

person Hasan A Yousef    schedule 25.11.2017
comment
В intellij вам вероятно нужно перейти к Files > Project structure и диалоговому окну под элементомSDK location, отменить выбор Use embedded JDK и указать на установленный вами JDK с javafx - person Gabriel Rohden; 15.03.2019

Ссылаясь на это, он работал с Intellij Idea добавив этот плагин:

apply from: "http://dl.bintray.com/content/shemnon/javafx-gradle/8.1.1/javafx.plugin"

К сожалению, этот плагин больше не поддерживается :(

Еще более странно то, что этот код требуется только один раз, после этого его можно удалить без каких-либо ошибок, возможно, он где-то обналичен !!

введите описание изображения здесь

person Hasan A Yousef    schedule 25.11.2017

Версия Gradle 6.4, версия Kotlin 1.3.72, версия Tornadofx 1.7.20, версия JDK 14

build.gradle добавить

plugins {
    id 'org.openjfx.javafxplugin' version '0.0.8'
}
javafx {
    version = "14"
    modules = [ 'javafx.controls', 'javafx.fxml' ]
}
person Александр Шлегель    schedule 29.05.2020
comment
не могли бы вы представить контекст о том, что вы сделали, чтобы другие и спрашивающий могли дать ответ на основе вашего ответа? - person dboy; 29.05.2020