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
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)
}
}
}
class MyApplication : Application() {
override fun start(primaryStage: Stage) {
}
}
fun main(args: Array<String>) {
Application.launch(MyApplication::class.Java, *args)
}
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)
}
}
}