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 写客户端真的一级棒。