JavaFXは、JavaでGUIアプリケーションを開発するためのツールキットです。JavaFXを使用すると、豊富なUIコントロール、グラフィックス、レイアウト、CSSスタイルシートなどを使用して、美しい、インタラクティブなデスクトップアプリケーションを作成できます。
JavaFXアプリケーションは、JavaFX Scene Graphと呼ばれるグラフィカルなオブジェクトツリーで構築されます。このScene Graphを構築するには、FXMLというXMLベースのマークアップ言語を使用することもできます。FXMLを使用すると、GUIのレイアウトとデザインを分離し、デザイナーとプログラマーが分業できます。
JavaFXには、JavaFXアプリケーションを構築するための豊富なAPIが用意されています。これには、UIコントロール（ラベル、ボタン、テキストボックスなど）、レイアウトマネージャー、アニメーション、トランジション、CSSスタイルシートなどが含まれます。また、FXMLを使用して、JavaコントローラクラスにUIコントロールをバインドし、ユーザーのアクションに応答するコードを記述できます。
JavaFXは、Java SE Development Kit（JDK）の一部であり、JavaFXを使用するためにはJDKをインストールする必要があります。また、JavaFXの最新バージョンは、OpenJFXプロジェクトとしてオープンソースで開発されており、多くのIDEがJavaFXプロジェクトをサポートしています。
FXMLとは、JavaFXのUIを宣言的に記述するXMLベースのマークアップ言語です。
FXMLを使用することで、JavaFXのUIをより簡単に作成できます。
以下は、FXMLの例です。
sample.fxml:
FXMLでは、UI要素を定義するためにXMLタグを使用し、その属性を使用してUI要素の属性を設定します。
FXMLファイルの最上位の要素はルート要素であり、この場合はStackPaneです。
StackPane要素のchildrenタグ内に、Text要素があり、そのtext属性にはテキストコンテンツが設定されます。
FXMLファイルは、JavaFXのアプリケーションクラスからロードされます。例えば、FXMLLoaderクラスを使用してロードできます。
以下は、FXMLを使用してJavaFXアプリケーションを初期化するためのコードの例です。
sample.java:
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class sample extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("ここはタイトル");
        primaryStage.setOnCloseRequest(e -> System.exit(0));
        FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
        StackPane root = loader.load();
        Scene scene = new Scene(root, 250, 200);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}
FXMLを使用する場合、start()メソッド内でFXMLファイルをロードする必要があります。
FXMLLoaderクラスを使用して、FXMLファイルを読み込み、FXMLのルート要素を取得します。
これをJavaFXのSceneに追加し、Stageに表示することができます。
JavaFXはCSSを使用して外観をスタイリングできます。CSSを使用すると、ボタン、ラベル、テキストフィールドなど、JavaFXの多くのUIコントロールの外観をカスタマイズできます。
sample.css:
.root {
    -fx-background-color: #f2f2f2; /* ルートノードの背景色 */ 
}
.text { 
    -fx-font-size: 24pt; /* テキストのフォントサイズ ''/ 
    -fx-text-fill: #ff0000; /'' テキストの文字色 */ 
}
以下は、AWT、Swing、およびJavaFXの特徴を比較する表です。
AWTは古典的なアプローチで、ネイティブOSの機能をそのまま利用しますが、機能やカスタマイズ性に制限があります。
SwingはAWTの欠点を克服し、より高度なカスタマイズ性や機能拡張を提供しますが、レンダリングやパフォーマンスに関しては劣ることがあります。
JavaFXはSwingと同様に多くのGUIコンポーネントを提供し、レスポンシブなレイアウト、アニメーション、3Dグラフィックス、FXMLといったモダンな特徴を持っています。
FXMLは機能的には優れているのですが、XMLに基づいているので記述性と可読性に難があります。
このため、いくつかの代替技術が開発されています。
以下はいくつかの代替技術の例です。
Kotlin DSL (Domain Specific Language): Kotlinは、Javaと互換性があり、JavaFXとの統合も簡単です。Kotlin DSLを使用してUIをプログラム的に構築することができます。Kotlin DSLは、JavaFXのAPIをより簡潔かつ直感的に使用することができます。この方法を選択すると、FXMLの代わりにUIをコードで構築することができます。
import javafx.application.Application
import javafx.scene.Scene
import javafx.scene.control.Button
import javafx.scene.layout.VBox
import javafx.stage.Stage
fun main() = launchApp {
    title = "KotlinFX Example"
    width = 300.0
    height = 200.0
    scene = scene {
        root = VBox {
            center = button("Click Me") {
                onAction {
                    println("Button clicked!")
                }
            }
        }
    }
}
TornadoFX: TornadoFXは、Kotlinで構築されたJavaFX向けの軽量フレームワークです。TornadoFXは、Kotlinの特性を活かしてUIを宣言的に構築し、FXMLを回避することができます。また、TornadoFXは、リアクティブプログラミングのサポートやDI (Dependency Injection) の統合など、さまざまな機能を提供します。
import tornadofx.*
class TornadoFXExample : App() {
    override fun start(stage: Stage) {
        stage {
            title = "TornadoFX Example"
            width = 300.0
            height = 200.0
            scene {
                root = vbox {
                    button("Click Me") {
                        setOnAction {
                            println("Button clicked!")
                        }
                    }
                }
            }
        }
    }
}
fun main() = launch()
GroovyFX: GroovyFXは、JavaFXをGroovyスクリプトで利用するためのライブラリです。GroovyFXを使用すると、JavaFXのAPIをGroovyの柔軟性と表現力を利用して利用することができます。これにより、FXMLを使用せずにUIをプログラム的に構築することができます。
@Grapes([
    @Grab('org.codehaus.groovyfx:groovyfx:0.6.0')
])
import groovyx.javafx.GroovyFX
def primaryStage = GroovyFX.start {
    title = "GroovyFX Example"
    width = 300
    height = 200
    vbox {
        button("Click me!") {
            setOnAction {
                println("Button clicked!")
            }
        }
    }
}
これらの代替技術は、FXMLを回避したり、UIの構築をよりプログラマブルにしたりするために使用することができます。KotlinやGroovyの柔軟性を活かしたUI開発を行いたい場合には、これらの代替技術が有用です。