科特林。基本的 JavaFX 应用程序

Kotlin. Basic JavaFX application

试用 Kotlin lang,我的印象是它与 Java 兼容,因此与 JavaFX 兼容,我尝试了以下操作:

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()
    }
}

这与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();
    }
}

但是 Kotlin 报错:Exception in thread "main" java.lang.RuntimeException: Unable to construct Application instance: class Test

您提供的代码示例不等价:Kotlin中的object declaration是一个单例,因此它只有一个在class初始化时调用私有构造函数构造的实例。 JavaFX 试图以反射方式调用 class 的构造函数但失败了,因为该构造函数应该是私有的。

您可能正在寻找的是一个简单的 class 声明,其 companion object 中包含 main。如果没有显式声明构造函数,Kotlin 将像 Java 一样生成一个默认构造函数,允许 JavaFX 实例化应用程序:

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)
}

这是启动 Java FX 应用程序的简单方法

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

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