JavaFXは、Javaでデスクトップアプリの画面を作るためのGUIツールキットです。「JavaFXは廃止された」と言われることがありますが、廃止はされていません。2018年のJDK 11でJDK本体から外れて別配布になっただけで、OpenJFXプロジェクトとして半年ごとに新しい版が出ています。2026年10月時点の最新は2026年9月15日公開のJavaFX 27で、動かすにはJDK 25以降が必要です。
この記事では、JavaFXの中身、「廃止」と言われる理由と2026年のサポート状況、Swingとの違いと選び方、JavaFX 27をMavenで動かす手順、SwingアプリへのJavaFXの組み込みを順に扱います。手順とコードは2026年10月13日に macOS(x86_64)の Temurin 25.0.4.1(一部は26.0.2.1)で実行し、出力を確かめたものです。
まとめ
- JavaFXは廃止されていない。JDK 11からJDKに同梱されなくなり、OpenJFXとして開発が続いている。最新はJavaFX 27(2026年9月15日)で、JavaFX 28は早期アクセス版が出ている。
- Oracle JDK 8に同梱されていたJavaFXは2025年3月でサポートを終え、2025年4月の8u451から同梱されなくなった。その後Oracleは2026年にJavaFXのサポートを再導入し、JavaFX 25は2030年9月までの予定を公表している。
- JavaFXの系列は使うJDKで決まる。JavaFX 27はJDK 25以上、JavaFX 25はJDK 23以上、JavaFX 21はJDK 17以上が必要。
- Swingとの大きな違いは、JDKに入っているかどうか、画面をFXMLとCSSで分けて書けるかどうか、UIスレッドの名前と規則。新規開発ならJavaFX、Swingの資産が大きいならSwingを続けて
JFXPanelで部分的に足す。 - 実行時はJavaFXをモジュールパスに置く。クラスパスに置いたまま
Applicationのサブクラスを起動すると「JavaFXランタイム・コンポーネントが不足」で止まる。
JavaFXとは:OpenJFXで開発されるJavaのGUIツールキット
JavaFXは、ウィンドウ、ボタン、表、グラフ、アニメーション、動画再生、Webページの表示までを部品としてそろえたGUIツールキットです。開発はOpenJDKのOpenJFXプロジェクトで行われ、ソースはGitHubの openjdk/jfx で公開されています。
OpenJFXのライセンスは、GPL v2に「Classpath Exception」を付けたものです(Oracle配布版の条件は後述)。SDKの legal フォルダに入っている条文には、このライブラリを独立したモジュールとリンクして実行可能なものを作ることを、そのモジュールのライセンスにかかわらず認める旨が書かれています。社内ツールや商用アプリに組み込むときは、この例外条項が前提になります。
JavaFX SDKに含まれるモジュール
JavaFXは機能ごとにモジュールが分かれていて、使うものだけを読み込みます。JavaFX 27のSDKに入っている主なモジュールは次のとおりです。
| モジュール | 主な用途 |
|---|---|
javafx.base |
プロパティ・バインディング・コレクション |
javafx.graphics |
Stage・Scene・描画・アニメーション |
javafx.controls |
Button・TableViewなどの部品 |
javafx.fxml |
FXMLファイルの読み込み |
javafx.media |
音声・動画の再生 |
javafx.web |
WebView(Webページの表示) |
javafx.swing |
Swingとの相互運用 |
jfx.incubator.richtext |
RichTextArea(試験的な機能) |
普通の画面を作るだけなら javafx.controls を指定すれば足ります。javafx.graphics と javafx.base は依存関係で一緒に読み込まれます。名前に incubator が付くモジュールは仕様が固まっていない試験機能なので、業務システムでは版を上げるたびにAPIが変わる前提で扱ってください。
FXMLとScene Builderによる画面とロジックの分離
JavaFXでは、画面の構造をFXML(XML形式のファイル)で、見た目をCSSで、処理をJavaのコントローラクラスで書き分けられます。FXMLはGluonが配布するScene Builderを使えば、部品をドラッグして配置しながら編集できます。後述のMavenサンプルをFXMLを使う画面へ広げるときは、同じ版の javafx-fxml 依存を追加します。画面設計とロジックを別の人が担当するチームでは、この分業がSwingに対する一番わかりやすい利点です。Swingは画面をJavaのコードで組み立てるのが基本で、見た目の切り替えはLook and Feelで行います。
JavaFXは廃止されたのか:JDKからの分離と2026年のサポート状況
JDK 11でのJavaFXの分離と別配布への変更
「JavaFXは廃止された」と言われる一番の理由は、JDK 11でJavaFXがJDKに入らなくなったことです。OracleのJDK移行ガイドには「JavaFX is no longer included in the JDK. It is now available as a separate download from openjfx.io」と書かれています。JavaFXを同梱していたOracle JDK 8では、何も足さずに import javafx.application.Application; などが通ったため、JDK 11以降へ上げたとたんにコンパイルが通らなくなり、「消えた」と受け取られました。
実際には配布の形が変わっただけで、Mavenの依存を1つ足すか、SDKを入れれば今のJDKでも使えます。Java 8から新しいJDKへ上げる作業の全体像は、Java 8をJava 25へ上げる判断基準と手順で扱っています。
Oracle JDK 8同梱のJavaFXは2025年3月で終了
JDK 8にはJavaFXが同梱されていましたが、Oracleは2020年に告知したとおり、JDK 8上のJavaFXのサポートを2025年3月で終えました。JDK 8u451のリリースノート(2025年4月15日)には「JDK 8 update 451 is the first upgrade of JDK/JRE 8 without JavaFX」とあります。Java 8のままJavaFXの画面を保守している現場では、8u451以降へ更新するとJDKからJavaFXが消える点を先に確認しておく必要があります。
2026年にOracleがJavaFXのサポートを再導入
2026年になって、Oracleは方針を一部戻しました。Oracle Java Verified Portfolioのサポートロードマップは「Oracle has reintroduced support for JavaFX」と書き、Oracle JDKの各版に対応するJavaFXのサポート期限を次のように示しています。
| Oracle JDK | JavaFX | 提供開始(予定日) | サポート期限 |
|---|---|---|---|
| 8(LTS) | 8 | 2026年4月21日 | 2028年3月 |
| 17・21(LTS) | 21 | 2026年4月21日 | 2028年9月 |
| 25(LTS) | 25 | 2026年3月17日 | 2030年9月 |
| 26 | 26 | 2026年3月17日 | 2026年9月 |
| 27 | 27 | 2026年9月 | 2027年3月 |
Oracle配布のJavaFXのライセンスは、対応するOracle JDKと同じです。Oracleの告知とJavaFXのダウンロードページによると、Oracle配布のJavaFX 27・25・21は、NFTC(Oracle No-Fee Terms and Conditions)のもとで本番利用・再配布とも無償です。ただしNFTCでの更新提供には期限があり、JavaFX 21は2026年9月まで、JavaFX 25は2028年9月まで、JavaFX 27はJavaFX 28に置き換わる2027年3月までです。21と25の期限後の更新版はJava SE OTNライセンスに切り替わり、無償範囲を超える本番利用は有償になります。JavaFX 17とJavaFX 8は開発・テスト・試作・デモ・個人利用などに限って無償で、それ以外の利用やOracleのサポートには別途商用ライセンスが必要です。Java 8のJavaFX画面を本番で動かし続けるなら、この条件が判断の分かれ目になります。
OpenJFXの版とLTS:無償ビルドはGluonが配布
Oracle配布版のほかに、OpenJFXのビルドも選べます。openjfx.ioのダウンロード先になっているGluonが主要OS向けの署名済みビルドを無償で配布しており、Maven Centralの org.openjfx グループからも取得できます。Gluonのロードマップでは17・21・25がLTS(長期サポート)の系列です。
| JavaFX | 公開 | 必要なJDK | 最新パッチ(2026年10月時点) | LTS |
|---|---|---|---|---|
| 27 | 2026年9月 | 25以上 | 27 | ― |
| 26 | 2026年3月 | 24以上 | 26.0.2(2026年7月) | ― |
| 25 | 2025年9月 | 23以上 | 25.0.4(2026年7月) | LTS |
| 21 | 2023年9月 | 17以上 | 21.0.12(2026年7月) | LTS |
| 17 | 2021年9月 | 11以上 | 17.0.20(2026年7月) | LTS(2026年10月まで) |
「必要なJDK」の列は、Maven Centralから取った javafx-base のクラスファイルの版でも確かめられます。実際に調べると、27は69(Java 25)、26は68(Java 24)、25は67(Java 23)、21.0.12は61(Java 17)、17.0.16は55(Java 11)で、表と一致しました。JavaFX 27のリリースノートによると、足りないJDKで起動すると javafx.base モジュールを読めないというエラーでJavaランチャーが終了します。
ここから選び方が決まります。JDK 21に固定された業務システムではJavaFX 25以降は動かないので、JavaFX 21の系列を使います。JDK 25 LTSへ上げられるなら、JavaFX 25(LTS)か27を選びます。JDK 27そのものの変更点はJava 27とは|非LTSの半年運用とG1・オブジェクトヘッダ既定化の影響にまとめています。
JavaFX 25〜27で追加された主な機能
JavaFXは保守だけの製品ではなく、半年ごとの版でAPIが増えています。直近3版のリリースノートから、アプリの作り方に関わるものを拾うと次のとおりです。
- JavaFX 25:タイトルバーにJavaFXのコントロールを置くAPI(プレビュー)、TextとTextFlowのレイアウト情報を取る公開API、TextAreaの複数行プロンプト。LinuxではGTK 3.20以上が必要になった。
- JavaFX 26:
ObservableList#replaceRange、区分線形のイージング関数、StageStyle.EXTENDEDのダイアログ(プレビュー)、macOS向けMetal描画パイプラインの実装。FXPermissionクラスは削除された。 - JavaFX 27:macOSの既定の描画パイプラインがOpenGLベースのES2からMetalに変わった。条件付きのスタイルシートimportとメディアクエリ、タイトルバーへのコントロール配置(正式機能)、RichTextAreaの画像・背景色・波線の属性も入った。
macOSで描画の崩れが出たときは、JavaFX 27のリリースノートにあるとおり -Dprism.order=es2 を付けて起動すると従来のES2パイプラインに戻せます。版を上げた直後に画面の不具合を切り分けるときの最初の手として覚えておくと役立ちます。
JavaFXとSwingの違い
SwingもJavaのGUIツールキットで、JDKの java.desktop モジュールに含まれています。両者の違いを項目ごとに並べると次のようになります。
| 項目 | JavaFX | Swing |
|---|---|---|
| JDKへの同梱 | なし(JDK 11以降は別配布) | あり(java.desktop) |
| 画面の書き方 | JavaコードまたはFXML | Javaコード |
| 見た目の調整 | CSS | Look and Feel |
| UIスレッド | JavaFX Application Thread | イベントディスパッチスレッド(EDT) |
| 値の連動 | プロパティとバインディング | リスナーを自分で書く |
| 動画の再生 | javafx.media | 標準の部品なし |
| Webページの表示 | WebView(javafx.web) | JEditorPane(HTML 3.2) |
| 描画 | Prism(macOSは27からMetal既定) | Java 2D |
| 最近の動き | 半年ごとに新API | 保守中心 |
実装で効いてくるのはスレッドと値の連動です。JavaFXはラベルの文字や表の行をプロパティとして持ち、bind でつなぐと片方の変更がもう片方に伝わります。Swingでは同じことをリスナーで書くため、画面の項目が多い業務アプリほどコード量に差が出ます。どちらも画面の更新はUIスレッドからしか行えない点は同じで、別スレッドから触ると表示が乱れたり例外が出たりします。
「Swingも廃止されるのでは」という心配もよく見かけますが、JDK 26で削除されたのはアプレット関連のAPIで、Swing本体は残っています。削除された範囲とSwingの書き方はJava Swingとは?廃止されたのはアプレットAPIだけ|AWTとの違いと使い方で詳しく扱っています。
JavaFXとSwingの選び方
新規のデスクトップアプリならJavaFX
これからJavaでデスクトップアプリを作るなら、JavaFXを選びます。FXMLとCSSで画面を分けられること、プロパティとバインディングで入力と表示を連動させやすいこと、半年ごとに機能が増えていることが理由です。JDKに同梱されない点は、開発時はMavenの依存と起動プラグインで、配布時は対象OS・CPUに合ったJavaFXのネイティブライブラリを同梱することで解決できます。
Swing資産が大きいならSwingを続けて部分導入
既存のSwing画面が業務の要件を満たしているなら、全面的なJavaFXへの書き換えは避けます。画面数、独自に作り込んだ部品、書き換え後の回帰テストの範囲を見積もり、移行で得られる機能や保守上の効果が費用に見合わなければ、既存画面を維持します。この場合はSwingを続け、グラフや動画、Webページの表示など新しく足す画面だけを、後述の JFXPanel でJavaFXにする方法が現実的です。
JavaFXを選ばないほうがよい場面
利用者が社外に多く、インストールの手間を減らしたいならWebアプリの方が向いています。JDKを古い版から上げられない環境も注意が必要で、JDK 17未満では、2026年10月以降も更新が続く系列(21・25・27)は動きません。Java 8のまま画面を保守し続けるなら、Oracleの契約で提供されるJavaFX 8を使うか、JDKを上げる計画を先に立てることになります。デスクトップとWebのどちらで作るかの判断から任せたい場合は、一創の業務用・Webアプリ開発でも相談を受けています。
JavaFX 27の導入手順:Mavenで最初の画面を出す
pom.xmlの設定
一番手早いのは、Mavenの依存に javafx-controls を足し、OpenJFXの javafx-maven-plugin で起動する方法です。プラグインがモジュールパスの組み立てを肩代わりし、OSに合ったネイティブライブラリ入りのjarも自動で選びます。以下はJDK 25とJavaFX 27で動かした pom.xml です。MavenとJDKを導入し、mvn -v でMavenがJDK 25以降を使っていることを確認してから、このファイルをプロジェクトのルートに保存してください。
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>demo</groupId>
<artifactId>hellofx</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.release>25</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<javafx.version>27</javafx.version>
</properties>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>${javafx.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.14.0</version>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.8</version>
<configuration>
<mainClass>demo.HelloFX</mainClass>
<options>
<option>--enable-native-access=javafx.graphics</option>
</options>
</configuration>
</plugin>
</plugins>
</build>
</project>
javafx-maven-plugin は2026年10月時点で0.0.8が最新です。--enable-native-access=javafx.graphics の行は無くても動きますが、JDK 25では起動のたびに制限付きメソッドの警告が出るため付けています(理由は後述)。
Hello Worldのコードと実行結果
src/main/java/demo/HelloFX.java に次のクラスを置きます。ラベルに実行中のJavaFXとJavaの版を出し、ボタンを押すと文字が変わるだけの画面です。
package demo;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class HelloFX extends Application {
@Override
public void start(Stage stage) {
Label label = new Label("JavaFX " + System.getProperty("javafx.runtime.version")
+ " / Java " + System.getProperty("java.version"));
Button button = new Button("クリック");
button.setOnAction(e -> label.setText("押されました"));
stage.setScene(new Scene(new VBox(10, label, button), 320, 120));
stage.setTitle("HelloFX");
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
mvn javafx:run で起動すると、ウィンドウのラベルに次の文字が表示されました。ボタンの処理を実行する(検証では button.fire() で発火)とラベルが「押されました」に変わり、Temurin 26.0.2.1でも同じ結果でした。
$ mvn javafx:run
(ウィンドウのラベル)JavaFX 27+30 / Java 25.0.4.1
(ボタンの処理の後)押されました
IDEで開発する場合も、Mavenプロジェクトとして読み込めば依存とプラグインの設定がそのまま使えます。IDEの導入はIntelliJ IDEAでJava開発を始める手順やEclipseとは|Java開発環境の導入・日本語化と使い方を参照してください。
SDKによるコンパイルとコマンドライン起動
Mavenを使わない場合は、GluonのダウンロードページからOSに合ったSDKを取得して展開します(macOS x86_64用の openjfx-27_osx-x64_bin-sdk.zip は約57MBでした)。lib フォルダをモジュールパスに渡し、使うモジュールを --add-modules で指定して、コンパイルと起動を行います。
$ javac --module-path javafx-sdk-27/lib --add-modules javafx.controls \
-d target/classes src/main/java/demo/HelloFX.java
$ java --module-path javafx-sdk-27/lib --add-modules javafx.controls \
--enable-native-access=javafx.graphics -cp target/classes demo.HelloFX
SDKで起動した場合も、ラベルの表示はMavenで起動したときと同じでした。複数のモジュールを使うときは --add-modules javafx.controls,javafx.fxml のようにカンマでつなぎます。
JavaFXの起動エラーとネイティブアクセス警告への対処
JavaFXのjarをクラスパスに置いたまま、Application のサブクラスを直接起動すると、次のエラーで止まります。英語環境では「Error: JavaFX runtime components are missing, and are required to run this application」と表示されます。
$ java -cp "target/classes:(JavaFXのjar群)" demo.HelloFX
エラー: JavaFXランタイム・コンポーネントが不足しており、このアプリケーションの実行に必要です
原因は、Application を継承したクラスを起動するときに、JavaFXがモジュールとして読み込まれていないことです。上のように --module-path と --add-modules を指定するか、Mavenプラグインで起動すれば解消します。
ネット上では、Application を継承しない別のクラスに main を置いて呼び出す回避策もよく紹介されています。試すと画面は出ますが、起動時に「Unsupported JavaFX configuration: classes were loaded from ‘unnamed module’」という警告が出ました。JavaFX自身がサポート外の構成だと言っているので、配布するアプリでは使わず、モジュールパスで起動する形にそろえてください。
JDK 24からは System.load が制限付きメソッドになったため、ネイティブアクセスを許可していないと、JavaFXのネイティブライブラリの読み込みで「A restricted method in java.lang.System has been called」という警告が出ます。モジュールパスで起動しているなら --enable-native-access=javafx.graphics、クラスパスで起動しているなら --enable-native-access=ALL-UNNAMED を付けると消えました。警告の文面は将来の版でこの呼び出しを既定でブロックすると予告しているため、今のうちに起動オプションへ入れておくのが安全です。
SwingアプリにJavaFXを組み込む:JFXPanelとスレッドの規則
SwingとJavaFXは同じアプリの中で混ぜられます。Swingの画面にJavaFXを埋め込むのが javafx.embed.swing.JFXPanel、逆にJavaFXの画面にSwingの部品を埋め込むのが SwingNode で、どちらも javafx.swing モジュールに入っています。次のコードは、Swingのウィンドウの中にJavaFXのラベルを表示する例です。src/main/java/demo/SwingWithFX.java に保存し、javafx.swing を加えてコンパイルしてから起動します。
package demo;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class SwingWithFX {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("Swing + JavaFX");
JFXPanel fxPanel = new JFXPanel(); // ここでJavaFXランタイムが起動する
frame.add(fxPanel);
frame.setSize(320, 120);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
Platform.runLater(() -> {
fxPanel.setScene(new Scene(new Label("Swingの中のJavaFX")));
System.out.println("FXスレッド: " + Platform.isFxApplicationThread());
SwingUtilities.invokeLater(() ->
System.out.println("EDT: " + SwingUtilities.isEventDispatchThread()));
});
});
}
}
$ javac --module-path javafx-sdk-27/lib --add-modules javafx.controls,javafx.swing \
-d target/classes src/main/java/demo/SwingWithFX.java
$ java --module-path javafx-sdk-27/lib --add-modules javafx.controls,javafx.swing \
--enable-native-access=javafx.graphics -cp target/classes demo.SwingWithFX
FXスレッド: true
EDT: true
注意が必要なのはスレッドの使い分けです。JFXPanelのAPIドキュメントは、JFXPanelはSwingの部品なのでEDTからだけ触ること、ただし setScene だけは例外だと定めています。上のコードはJFXPanelの生成をEDTで行い、JavaFXの部品づくりは Platform.runLater でJavaFX Application Threadに渡しています。出力の「FXスレッド: true」「EDT: true」は、それぞれの処理が正しいスレッドで動いたことを示しています。
逆向きの SwingNode でも、中に入れるSwingの部品はEDTから操作する決まりです。起動時は --add-modules に javafx.swing を足し、Mavenなら javafx-swing の依存を加えます。
よくある質問
JavaFXは廃止されたのですか?
廃止されていません。JDK 11からJDKに同梱されなくなっただけで、OpenJFXとして開発が続いており、2026年9月15日にJavaFX 27が公開されています。Oracle JDK 8に同梱されていたJavaFXは2025年3月にいったんサポートを終えましたが、Oracleは2026年にJavaFX 8を含むサポートを再導入しました。
JavaFXの後継となる技術はありますか?
Oracleが公式に示した後継の技術はありません。JavaFX自体が新しい版を出し続けており、Oracleも2026年にサポートを再導入しています。Javaにこだわらないなら、Webアプリにする選択肢もあります。
Java Swingも廃止されるのですか?
Swingは今もJDKに含まれています。JDK 26で削除されたのはアプレット関連のAPIで、Swing本体ではありません。新規開発ではJavaFXを優先しつつ、既存のSwingアプリはそのまま保守できます。
JavaFXは無料で使えますか?
OpenJFXのビルドは無料で使えます。ライセンスはGPL v2にClasspath Exceptionを付けたもので、GluonのダウンロードページやMaven Centralから入手できます。Oracle配布版もJavaFX 27・25・21はNFTCで無償ですが、NFTCでの更新提供には期限があり(21は2026年9月まで)、その後の更新版はOTNライセンスに切り替わります。JavaFX 8と17は開発や個人利用などに限って無償です。長期の修正提供が必要な場合は、Gluonの商用LTSやOracleのサポート契約を検討します。
JavaFXで何ができますか?
ボタンや表、グラフを使った業務画面のほか、アニメーション、音声・動画の再生、WebViewによるWebページの表示ができます。FXMLとScene Builderで画面を設計し、CSSで見た目を整えられます。