【问题标题】:Kotlin. Basic JavaFX application科特林。基本 JavaFX 应用程序
【发布时间】:2016-01-16 23:20:18
【问题描述】:

试用 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 报错:线程“main”java.lang.RuntimeException 中的异常:无法构造应用程序实例:类测试

【问题讨论】:

    标签: javafx kotlin


    【解决方案1】:

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

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

    class Test : Application() {
        override fun start(stage: Stage) {
            ...
        }
    
        companion object {
            @JvmStatic
            fun main(args: Array<String>) {
                launch(Test::class.java)
            }
        }
    }
    

    【讨论】:

    • 您也可以直接在顶级作用域中直接添加fun main() 位。
    • 它工作得更好一点,但仍然有:线程“main”中的异常 java.lang.RuntimeException:错误:类 TestKt$Companion 不是 javafx.application.Application 的子类
    • 我认为你应该使用这种应用方法:docs.oracle.com/javafx/2/api/javafx/application/…。在 Kotlin 中,这将是 launch(TestKt::class.java)
    • 现在成功了,谢谢)您能否也更新您的初始答案以使其完整? Спасибо)
    • 这可行,但它不会将程序参数传递给应用程序。我个人使用@JvmStatic fun main(vararg args:String){launch(Main::class.java,*args);}
    【解决方案2】:
    class MyApplication : Application() {
    
       override fun start(primaryStage: Stage) {
    
       }
    }
    
    fun main(args: Array<String>) {
       Application.launch(MyApplication::class.java, *args)
    }
    

    【讨论】:

      【解决方案3】:

      这是执行 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)
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-05-11
        • 1970-01-01
        • 1970-01-01
        • 2021-06-06
        • 2021-11-28
        • 1970-01-01
        • 2022-11-19
        • 1970-01-01
        • 2019-07-18
        相关资源
        最近更新 更多