Kotlin 创建 JavaFX 应用的几种方法

前言

很久没写过 JavaFX 了,还记得曾经主要使用 Java 那会儿写过一些 FX 应用。后来很长一段时间 Java 个人用途用得并不多了,习惯用 Kotlin/Groovy/Scala 代替。尤其是 Kotlin 用来写客户端应用比较多,当然有一方面是安卓。
后来,某一次我特别想开发一个 MC 启动器。便有了重新拾起 JavaFX 的念头,当然我并不太想用 Java 写客户端。于是我打算尝试用 Kotlin 使用 Java7 及以上自带的 JavaFX 包来写 GUI 应用。

几种可行方案

首先一个正常的 JavaFX 程序是这样的(Java 原版)

import javafx.application.Application;
          import javafx.stage.Stage;
          
          public class JApp extends Application {
          
              @Override
              public void start(Stage primaryStage) throws Exception {
                  // Fill the GUI
              }
          
              public static void main(String[] args) {
                  JApp.launch(args);
              }
          }
          

由于 Kotlin 没有静态方法, Kotlin 程序的入口只需要一个普通的 main 函数即可。所以我起初尝试这样:

import javafx.application.Application
          import javafx.stage.Stage
          
          class KApp :Application(){
          
              override fun start(primaryStage: Stage?) {
                  // Fill the GUI
              }
          
          }
          
          fun main(args: Array<String>) {
              KApp.launch(args) // 这里出现错误,并没有 launch 这个方法
          }
          

JApp 类中的静态方法 launch 是从 Application 继承过来的,在 Java 代码中能调用成功。但是 KApp 是 Kotlin 类,并没有“静态方法”这个元素。所以不能企图通过类名调用 Kotlin 中不存在的“静态方法”。

那么,我调用 Java 类中的静态方法不就行了吗?所以可以这样做:

class KApp :Application(){
          
              override fun start(primaryStage: Stage?) {
                  // Fill the GUI
              }
          
          }
          
          fun main(args: Array<String>) = Application.launch(*args)
          

OK,问题已解决。当然好奇心驱使我想知道其他人都是怎么做的?老外们是怎么做的?
经过谷歌,发现了还可以这样。

  1. 在 App 类添加 companion 对象,添加 main 方法加上 JvmStatic 注解生成对应的 JVM 静态方法。

    companion object {
                  @JvmStatic
                  fun main(args: Array<String>) {
                      launch(KApp::class.java, *args)
                  }
              }
              
  2. (滥竽充数系列)main 函数中调用第二种 launch 方法,传递 KApp 的 Java Class 实例。

    fun main(args: Array<String>) = Application.launch(KApp::class.java, *args)
              

总结

  1. 这是篇没任何技术含量的水文。
  2. Kotlin 写客户端真的一级棒。