web-dev-qa-db-fra.com

Kotlin. Application JavaFX de base

En essayant Kotlin lang et j'ai eu l'impression qu'il est compatible avec Java et donc avec JavaFX et j'ai essayé de suivre:

public object TestKt: Application() {

    public override fun start(stage: Stage){
        val pane= Pane()
        val scene=Scene(pane,200.0,200.0)
        stage.scene = scene
        stage.show()

    }
    @JvmStatic public fun main(args: Array<String>){
        launch()
    }
}

c'est fondamentalement le même que celui de Java

public class Test extends Application {
    @Override
    public void start(Stage stage)  {
        Pane pane=new Pane();
        Scene scene=new Scene(pane, 200,200);
        stage.setScene(scene);
        stage.show();
    }
    public static  void  main(String[] args){
        launch();
    }
}

mais Kotlin donne une erreur: Exception dans le thread "principal" Java.lang.RuntimeException: Impossible de construire une instance d'application: classe Test

17
Elavrius

Les exemples de code que vous avez fournis ne sont pas équivalents: une déclaration object dans Kotlin est un singleton, elle ne possède donc qu'une seule instance construite en appelant le constructeur privé lorsque la classe est initialisée. JavaFX tente d'appeler le constructeur de la classe de manière réfléchie, mais échoue car le constructeur est privé comme il se doit.

Ce que vous cherchez peut-être à la place est une déclaration de classe simple, avec main dans son objet compagnon . Si aucun constructeur explicite n'est déclaré, Kotlin, comme Java, en générera un par défaut, permettant à JavaFX d'instancier l'application:

class Test : Application() {
    override fun start(stage: Stage) {
        ...
    }

    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            launch(Test::class.Java)
        }
    }
}
41
Alexander Udalov
class MyApplication : Application() {

   override fun start(primaryStage: Stage) {

   }
}

fun main(args: Array<String>) {
   Application.launch(MyApplication::class.Java, *args)
}
28
jenglert

Voici une méthode simple pour lancer le lancement de Java FX Application

class MyApplication: Application(){
    override fun start(primaryStage: Stage?){
        //You code here
    }

    companion object{
        @JvmStatic
        fun main(args: Array<String>){
            launch(MyApplication::class.Java, *args)
        }
    }
}
0
masoomyf