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

Ela*_*ius 23 javafx kotlin

尝试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()
    }
}
Run Code Online (Sandbox Code Playgroud)

这与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();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是Kotlin给出了一个错误:线程"main"中的异常java.lang.RuntimeException:无法构造Application实例:class Test

Ale*_*lov 49

您提供的代码示例不等效:Kotlin中的object声明是单例,因此它只有一个实例通过在初始化类时调用私有构造函数构造.JavaFX试图反射性地调用类的构造函数但是失败,因为构造函数应该是私有的.

您可能正在寻找的是一个简单的类声明,main伴随对象.如果没有声明显式构造函数,Kotlin将像Java一样生成一个默认构造函数,允许JavaFX实例化应用程序:

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

    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            launch(Test::class.java)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这有效,但它不会将程序参数传递给Application.我个人使用`@JvmStatic fun main(vararg args:String){launch(Main :: class.java,*args);}` (4认同)
  • 您也可以直接在顶级范围内填充`fun main()`位. (3认同)
  • 它工作得好一点,但仍然有:线程"main"中的异常java.lang.RuntimeException:错误:类TestKt $ Companion不是javafx.application.Application的子类 (3认同)

jen*_*ert 32

class MyApplication : Application() {

   override fun start(primaryStage: Stage) {

   }
}

fun main(args: Array<String>) {
   Application.launch(MyApplication::class.java, *args)
}
Run Code Online (Sandbox Code Playgroud)