Zastanawialiście się kiedyś, czy da się uruchomić aplikację JavaFX w Kotlinie? Da się i – wbrew pozorom – nie jest to wcale trudne. Załóżmy, że mamy klasę JavaFX, taką jak poniżej:
package assets;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class ClassTemplate extends
Application {
@Override
public void init() {
}
@Override
public void start(Stage stage) {
try {
StackPane root = new StackPane();
Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);
stage.setTitle(this.getClass().getName());
stage.setOnCloseRequest(e -> Platform.exit());
stage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void stop() {
}
public static void main(String[] args) {
Application.launch(args);
}
}
Teraz wystarczy użyć automatycznego tłumaczam dostępnego w IntelliJ IDEA. Po poprawieniu Int na Double i uporządkowaniu sekcji importów, otrzymamy kod taki jak poniżej:
package assets
import javafx.application.Application
import javafx.application.Platform
import javafx.event.EventHandler
import javafx.scene.Scene
import javafx.scene.layout.StackPane
import javafx.stage.Stage
class ClassTemplate : Application() {
override fun init() {}
override fun start(stage: Stage) {
try {
val root = StackPane()
val scene = Scene(root, 300.0,
200.0)
stage.scene = scene
stage.title = this.javaClass.name
stage.onCloseRequest = EventHandler { Platform.exit() }
stage.show()
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun stop() {}
companion object {
@JvmStatic
fun main(args: Array<String>) {
launch(*args)
}
}
}
To jednak nie wystarczy – jeśli spróbujemy ten kod uruchomić, otrzymamy błąd:

Powodem jest błędne tłumaczenie metody main uruchamiającej aplikację. Po poprawieniu kodu klasa powinna wyglądać tak:
package assets
import javafx.application.Application
import javafx.application.Platform
import javafx.event.EventHandler
import javafx.scene.Scene
import javafx.scene.layout.StackPane
import javafx.stage.Stage
class ClassTemplate : Application() {
override fun init() {}
override fun start(stage: Stage) {
try {
val root = StackPane()
val scene = Scene(root, 300.0,
200.0)
stage.scene = scene
stage.title = this.javaClass.name
stage.onCloseRequest = EventHandler { Platform.exit() }
stage.show()
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun stop() {}
companion object {
@JvmStatic
fun main(args: Array<String>) {
launch(ClassTemplate::class.java, *args)
}
}
}
Zauważcie, że zmienił się tylko parametr metody launch(). Teraz kod powinien uruchomić się poprawnie. Oczywiście dla porządku metodę main możemy wyłączyć poza klasę, tak jak widać poniżej:
package assets
import javafx.application.Application
import javafx.stage.Stage
import javafx.scene.layout.StackPane
import javafx.scene.Scene
import java.lang.Exception
import kotlin.jvm.JvmStatic
class ClassTemplate2 : Application() {
override fun init() {}
override fun start(stage: Stage) {
try {
val root = StackPane()
stage.scene = Scene(root, 300.0, 200.0)
stage.show()
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun stop() {}
}
fun main(args: Array<String>) {
Application.launch(ClassTemplate2::class.java, *args)
}
W ten sposób można oczywiście „przetłumaczyć” dowolną klasę JavaFX na Kotlina.