本ページはプロモーションが含まれています

Java入門

Java GUI入門!SwingとJavaFX 2大ライブラリを徹底比較

トム

・都内自社開発IT企業勤務/javaのバックエンドエンジニア
/java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎

Javaでプログラミングを学び始めると、コンソールでの文字入力だけでは物足りなくなりませんか?

「ボタンやテキストボックスがある、普段使っているようなアプリを作ってみたい」

「JavaでGUIアプリを作りたいけれど、何から手をつければいいの?」

多くの初学者がCUIでつまずくか、次のステップとしてGUI開発に進もうとして「ライブラリが多すぎて分からない」と悩む姿を見ています。

この記事は、「JavaでGUIを作りたい」と考える方に向けて書いています。

この記事を読めば、JavaのGUI開発の基本から、代表的な2大ライブラリである「Swing」と「JavaFX」の違い、それぞれの作り方、そして学習の進め方までを網羅的に理解できます。

JavaのGUIとは?基本をわかりやすく解説

JavaでGUIアプリを作る方法を知る前に、まずは「GUIとは何か」という基本をおさらいしましょう。

GUI(グラフィカルユーザーインターフェース)とは何か

GUIとは「Graphical User Interface」の略です。

私たちが普段コンピュータを操作するとき、マウスでアイコンをクリックしたり、ウィンドウをドラッグしたりします。ボタン、メニュー、スライダー、テキスト入力欄など、画面上の図形を通して、コンピュータと対話する仕組み。それがGUIです。

直感的でわかりやすい操作が可能なため、多くのOSやアプリケーションで採用されています。

JavaでGUIを作るメリット・デメリット

JavaでGUIアプリケーションを作る主なメリットは、OSに依存しない点です。

Javaには「Write Once, Run Anywhere(一度書けば、どこでも動く)」という有名なスローガンがあります。Javaで作ったGUIアプリは、Windowsでも、Macでも、Linuxでも、基本的には同じコードで動作します。これは大きな強みです。

一方で、デメリットも存在します。

  1. 学習コスト:GUIの部品(コンポーネント)を画面に配置する「レイアウト」の仕組みを学ぶのに少し時間がかかります。
  2. デザイン:標準のままでは、見た目が少し古いと感じられることがあります。
  3. 実行環境:アプリを動かすためには、利用者のコンピュータにJREが必要になる場合があります。

とはいえ、これらのデメリットは、後述するモダンなライブラリや配布方法によって解決しつつあります。

CLI(コンソール操作)との違い

GUIの対極にあるのが「CLI(Command Line Interface)」です。

CLIは、キーボードからコマンドを打ち込んで操作する方式です。プログラミング学習で最初に行う「Hello, World!」の表示は、このCLI上で行われます。

  • GUI:マウス操作が中心。直感的で初心者にもやさしい。
  • CLI:キーボード操作が中心。自動化やサーバー操作に向いており、プロの開発者には必須のスキル。

JavaのGUI開発とは、このCLIから一歩進んで、ユーザーが視覚的に操作できるアプリケーションを作る技術です。

JavaのGUIで使える代表的なライブラリ

JavaでGUIを作るためには、専用のライブラリを使います。現在、主に使われているのは「Swing」と「JavaFX」の2つです。

Swingとは?特徴とできること

Swingは、Javaの標準機能として長く提供されてきたGUIライブラリです(javax.swingパッケージ)。シンプルなメモ帳アプリから、データベースと連携する企業の複雑な業務管理ツールまで、あらゆるデスクトップアプリケーションが作れます。

特徴

  1. Java標準:Java 1.2から長らく標準APIとして搭載されてきました(※Java 9以降は標準から外れましたが、互換性は維持されています)。
  2. 軽量:OSの部品に頼らず、すべてJava自身で部品を描画します。そのため、どのOSでも見た目が(ほぼ)同じになります。
  3. 豊富な部品:ボタンやラベルはもちろん、表やツリーなど、複雑な部品が揃っています。
  4. 成熟した技術:歴史が長いため、情報やドキュメントが非常に豊富です。

JavaFXとは?モダンなUIを作れる理由

JavaFXは、Swingの後継として登場した、よりモダンなGUIライブラリです。見た目にこだわったリッチなデスクトップアプリ、グラフやチャートを多用する分析ツール、メディアプレイヤーなどの開発に向いています。

特徴

  1. モダンなデザイン:Swingよりも洗練された見た目の部品が揃っています。
  2. CSSによる装飾:Webページを作るように、CSSを使ってアプリのデザインを自由に変更可能です。
  3. FXML:レイアウトをXMLファイルとして分離できます。これにより、デザインとロジックを分けて開発できます。
  4. 高機能:3Dグラフィックスや動画・音声の再生、Webコンテンツの埋め込みなど、リッチな表現が得意です。
  5. JDKから分離:Java 11以降、JDKから分離されました。別途「OpenJFX」というライブラリを導入して使います。

AWTとの違いと役割

AWT(Abstract Window Toolkit)は、Javaの最初期から存在する最も古いGUIライブラリです。

AWTは、OSが元々持っているGUI部品をそのまま呼び出して使います。そのため、OSによって見た目や動作が微妙に異なるという欠点がありました。

Swingは、AWTのウィンドウの上で、部品の見た目自体はすべてJavaで描画することで、OS間の差異をなくしました。

現在、AWTを直接使ってGUIアプリを一から作ることはほとんどありません。しかし、Swingの土台として、今もJavaのGUI技術の根幹を支えています。

初心者におすすめなのはどれ?

どちらを選ぶかは、あなたの目的によって決まります。GUIプログラミングの「仕組み」を学ぶならSwing、モダンな「作品」を作りたいならJavaFXがおすすめです。

Swingがおすすめな理由

  • 仕組みが比較的シンプルです。
  • Javaの標準的な機能(javax.swing)を使っている感覚で学べます。
  • イベント処理など、GUIの基本的な考え方を学ぶのに最適です。

JavaFXがおすすめな理由

  • CSSやFXMLなど、現代的な開発手法を学べます。
  • 見た目が良いため、学習のモチベーションを維持しやすいです。
  • ポートフォリオとして公開できる品質のアプリが作れます。

この記事では、両方の作り方を解説します。まずはSwingで基本をつかみ、次にJavaFXに挑戦する流れが最も効率的かもしれません。

Swingを使ったGUIの作り方【サンプルコード付き】

まずはSwingを使って、シンプルなウィンドウを表示し、ボタンを配置する流れを見ていきましょう。

ウィンドウを表示する基本コード

Swingでウィンドウを表示するには、JFrameクラスを使います。

import javax.swing.JFrame;

public class SwingApp {
    public static void main(String[] args) {
        // 1. ウィンドウの枠(JFrame)を作る
        JFrame frame = new JFrame("Swingウィンドウのテスト");

        // 2. ウィンドウのサイズを決める
        frame.setSize(400, 300); // 幅400ピクセル, 高さ300ピクセル

        // 3. ウィンドウを閉じたらプログラムも終了するように設定
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 4. ウィンドウを画面中央に表示
        frame.setLocationRelativeTo(null);

        // 5. ウィンドウを表示する(重要!)
        frame.setVisible(true);
    }
}

コードの解説:

  • JFrameがウィンドウ本体です。コンストラクタの引数でタイトルバーの文字を決められます。
  • setSizeで大きさを指定します。
  • setDefaultCloseOperationは非常に重要です。EXIT_ON_CLOSEを設定しないと、ウィンドウを閉じてもプログラムが動き続けてしまいます。
  • setVisible(true)を最後に呼び出すと、ウィンドウが画面に表示されます。

ボタンやラベルを配置する方法

ウィンドウ(JFrame)に直接ボタンなどを置くのではなく、通常はJPanelという「土台」を間に挟みます。

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;

public class SwingPanelApp {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Swingの部品配置");
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        // 1. 土台となるパネル(JPanel)を作る
        JPanel panel = new JPanel();

        // 2. ラベル(JLabel)を作る
        JLabel label = new JLabel("こんにちは、Swing!");

        // 3. ボタン(JButton)を作る
        JButton button = new JButton("クリックしてね");

        // 4. パネルにラベルとボタンを追加
        panel.add(label);
        panel.add(button);

        // 5. ウィンドウにパネルを追加
        frame.add(panel);

        // 6. ウィンドウを表示
        frame.setVisible(true);
    }
}

コードの解説:

  • JPanelを作り、そこにJLabelJButtonaddメソッドで追加します。
  • 最後に、JFrameJPaneladdします。
  • JPanelは標準でFlowLayoutというレイアウト管理方法が使われており、部品を追加した順に左から右へ並べてくれます。

イベント処理(クリック動作など)の実装

GUIアプリの核心は「イベント処理」です。ボタンが押された、キーボードが押された、といったイベントを検知して、対応する処理を実行します。

ボタンクリックを処理するには、ActionListenerを使います。

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;
import java.awt.Font; // Fontクラスをインポート

public class SwingEventApp {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Swingのイベント処理");
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        JPanel panel = new JPanel();
        
        // ラベルを作成
        JLabel label = new JLabel("ボタンが押されるのを待っています...");
        label.setFont(new Font("MS Gothic", Font.PLAIN, 16)); // フォントを設定

        // ボタンを作成
        JButton button = new JButton("ここをクリック");

        // 1. ボタンにActionListenerを「登録」する
        // Java 8以降のラムダ式を使った書き方
        button.addActionListener(e -> {
            // 2. ボタンが押されたときに実行したい処理
            label.setText("ボタンがクリックされました!");
        });

        panel.add(label);
        panel.add(button);
        frame.add(panel);
        frame.setVisible(true);
    }
}

コードの解説:

  • button.addActionListener(...)で、ボタンが押されたときの「監視役」を登録します。
  • e -> { ... }の部分が、ラムダ式と呼ばれるJava 8からの簡潔な記述法です。
  • { ... } の中に、ボタンが押されたときに実行したい処理(ここではラベルの文字を変更する処理)を書きます。

Swingアプリを実行する流れ

Swingのプログラムは、「Event Dispatch Thread (EDT)」という特別なスレッドで実行するのがお作法です。GUIの操作が複数のスレッドから行われると、予期せぬエラーが起きるためです。

メインメソッドを以下のように書くのが最も安全です。

import javax.swing.SwingUtilities;
import javax.swing.JFrame;

public class SwingMain {
    
    // コンストラクタでGUIを構築する
    public SwingMain() {
        JFrame frame = new JFrame("EDTのテスト");
        frame.setSize(300, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        // Swingの処理をEDTで行うように予約する
        SwingUtilities.invokeLater(() -> {
            new SwingMain(); // GUIを構築するクラスのインスタンスを生成
        });
    }
}

JavaFXで作るモダンGUIの作り方

次に、JavaFXの作り方を見ていきましょう。JavaFXはSwingと異なり、セットアップが少し必要です。

JavaFXプロジェクトの作成手順

Java 11以降、JavaFXはJDKに含まれません。そのため、開発環境(IDE)でMavenやGradleといったビルドツールを使って、JavaFXライブラリ(OpenJFX)を導入するのが一般的です。

  1. IDEの準備:IntelliJ IDEAやEclipseなどのIDEを使います。
  2. プロジェクト作成:MavenプロジェクトまたはGradleプロジェクトとして作成します。
  3. 依存関係の追加pom.xml(Mavenの場合)に必要なJavaFXモジュール(javafx-controlsjavafx-fxml)を記述します。
  4. メインクラスの作成:メインクラスはjavafx.application.Applicationを継承し、start()メソッドを実装します。
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class JavaFxApp extends Application {

    // Applicationクラスのstartメソッドを上書きする
    @Override
    public void start(Stage primaryStage) {
        // 1. 部品(ラベル)を作る
        Label label = new Label("こんにちは、JavaFX!");

        // 2. レイアウト(土台)を作る
        StackPane root = new StackPane();
        root.getChildren().add(label);

        // 3. シーン(場面)を作る(土台をシーンに乗せる)
        Scene scene = new Scene(root, 400, 300);

        // 4. ステージ(ウィンドウ)にシーンを設定
        primaryStage.setTitle("JavaFXのテスト");
        primaryStage.setScene(scene);

        // 5. ステージを表示
        primaryStage.show();
    }

    public static void main(String[] args) {
        // launchメソッドでJavaFXアプリを起動
        launch(args);
    }
}

コードの解説:

  • SwingのJFrameがJavaFXではStage(舞台)にあたります。
  • JPanelPaneStackPaneVBox, HBoxなど)にあたります。
  • Stageには直接部品を置けず、Scene(場面)を設定します。SceneにはPaneなどのレイアウトを配置します。
  • mainメソッドからはlaunch(args)を呼び出すだけです。

FXMLを使ったレイアウト設計

JavaFXの最大の特徴がFXMLです。これは、画面のレイアウトをXMLファイルに記述する仕組みです。

sample.fxml (レイアウト定義ファイル)

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Button?>
<?import javafx.geometry.Insets?>

<VBox alignment="CENTER" spacing="10" xmlns="http://javafx.com/javafx/11"
      xmlns:fx="http://javafx.com/fxml/1"
      fx:controller="com.example.JavaFxController">
    
    <padding>
        <Insets top="20" right="20" bottom="20" left="20"/>
    </padding>

    <Label fx:id="myLabel" text="JavaFXとFXMLのテスト"/>
    
    <Button fx:id="myButton" text="クリック!" onAction="#handleButtonClick"/>

</VBox>

メインクラス (JavaFxFxmlApp.java)

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class JavaFxFxmlApp extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        // 1. FXMLファイルを読み込む
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));

        primaryStage.setTitle("FXMLのテスト");
        primaryStage.setScene(new Scene(root, 300, 200));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

コントローラクラスの実装方法

FXMLで定義したボタンが押されたときの処理は、fx:controllerで指定した「コントローラクラス」に記述します。

JavaFxController.java (コントローラクラス)

import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.Button;

public class JavaFxController {

    // 1. FXMLの fx:id と Javaの変数を紐づける
    @FXML
    private Label myLabel;

    @FXML
    private Button myButton;

    // 2. FXMLの onAction と Javaのメソッドを紐づける
    @FXML
    protected void handleButtonClick() {
        myLabel.setText("FXMLボタンがクリックされました!");
        myButton.setDisable(true); // ボタンを無効化
    }
    
    // FXMLが読み込まれた直後に呼ばれる初期化メソッド
    @FXML
    private void initialize() {
        // 初期設定など
        System.out.println("コントローラが初期化されました。");
    }
}

解説:

  • @FXMLアノテーションが、FXMLファイル内の部品とJavaコードの変数を繋ぎます。
  • onAction="#handleButtonClick"とFXMLに書くと、ボタンが押されたときにhandleButtonClick()メソッドが自動的に呼ばれます。
  • Javaコード(ロジック)とFXML(デザイン)が完全に分離できました。

CSSでデザインをカスタマイズする方法

JavaFXはCSSで見た目を自由に変えられます。

/* ボタンのデフォルトスタイル */
.button {
    -fx-font-size: 16px;
    -fx-background-color: #007bff; /* 青色 */
    -fx-text-fill: white; /* 文字色を白 */
    -fx-background-radius: 5; /* 角を丸く */
}

/* ボタンにマウスが乗ったときのスタイル */
.button:hover {
    -fx-background-color: #0056b3; /* 少し濃い青 */
}

/* ラベルのスタイル */
#myLabel { /* fx:idがmyLabelの要素に適用 */
    -fx-font-size: 20px;
    -fx-font-weight: bold;
}

Javaコード(FXML読み込み後に追加)

    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        Scene scene = new Scene(root, 300, 200);

        // CSSファイルを読み込んでシーンに適用
        scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());

        primaryStage.setTitle("FXMLとCSSのテスト");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

getStylesheets().add() でCSSを読み込むだけで、アプリの見た目がガラッと変わります。

GUI開発を効率化するツールとフレームワーク

javaのgui開発を、すべて手書きのコードで行うのは大変です。便利なツールを使いましょう。

Scene Builderを使って視覚的に設計する

JavaFXのFXMLファイルは、XMLを手書きする代わりに「Scene Builder」というツールで視覚的に作成できます。

Scene Builderは、部品をドラッグ&ドロップで配置できるGUIデザインツールです。配置した結果は自動的にFXMLファイルとして保存されます。

デザイナーとプログラマーが分業する際にも非常に強力なツールです。

IntelliJ IDEAやEclipseでのGUI開発手順

IntelliJ IDEAやEclipseといった高機能なIDE(統合開発環境)には、GUI開発を支援する機能があります。

  • IntelliJ IDEA:標準でJavaFXとScene Builderの連携機能が強力です。pom.xmlやVMオプションの設定もIDEが支援してくれます。
  • Eclipse:e(fx)clipseプラグインを導入することで、JavaFX開発がやりやすくなります。

どちらのIDEも、Swing用のGUIビルダー(IntelliJの「GUI Designer」やEclipseの「WindowBuilder」)を備えていますが、これらはJavaコードを自動生成するタイプです。FXMLで分離するJavaFXの方法が、現在は主流となっています。

FXMLとMVC構造で保守性を高めるコツ

JavaFXとFXMLの仕組みは、「MVCデザインパターン」という設計手法に基づいています。

  • Model(モデル):アプリケーションのデータやビジネスロジック。(例:Userクラス、計算ロジック)
  • View(ビュー):画面の見た目。FXMLファイルがこれにあたります。
  • Controller(コントローラ):ユーザーの入力を受けて、ModelとViewを仲介する。コントローラクラスがこれにあたります。

この3つをきちんと分離して開発すると、コードが整理され、後からの修正や機能追加(保守)が非常に楽になります。

よくあるエラーとトラブル解決法

GUI開発では特有のエラーがいくつかあります。

「NoClassDefFoundError」などのビルドエラー対処

JavaFXアプリを実行しようとしたとき、Error: JavaFX runtime components are missingNoClassDefFoundError: javafx/application/Application というエラーが出ることがあります。

これは、Java 11以降でJavaFXがJDKから分離されたため、実行時にJavaFXライブラリが見つけられないことが原因です。

解決法:

  1. Maven/Gradleを使う:ビルドツールが自動的にJavaFXライブラリを含めてくれる設定になっているか確認します。
  2. VMオプションを指定する:IDEの実行構成で、JavaFX SDK(ライブラリ)の場所をVMオプションで指定します。(例:--module-path /path/to/javafx-sdk-17/lib --add-modules javafx.controls,javafx.fxml)

コンポーネントが表示されないときの原因

「コードは書いたのに、ボタンやラベルが画面に表示されない」というトラブルです。

  • Swingの場合
    1. 最後にframe.setVisible(true)を呼び出していますか?
    2. 部品をaddした後にsetVisibleを呼んでいますか?
    3. JPanelなどをJFrameaddし忘れていませんか?
    4. (実行中に部品を追加した場合)revalidate()repaint()を呼びましたか?
  • JavaFXの場合
    1. StageSceneを、ScenePaneをきちんと設定していますか?
    2. PanegetChildren().add(...)で部品を追加しましたか?
    3. primaryStage.show()を呼び出していますか?

イベントが反応しないときの確認ポイント

「ボタンをクリックしても、何も起こらない」というトラブルです。

  • Swingの場合
    1. button.addActionListener(...)を正しく呼び出しましたか?
    2. 部品がsetEnabled(false)で無効化されていませんか?
  • JavaFX (FXML)の場合
    1. FXMLファイルのonAction="#methodName"のメソッド名と、コントローラクラスの@FXML void methodName()のメソッド名が一致していますか?
    2. FXMLファイルにfx:controller="com.example.YourController"の指定を忘れていませんか?

JavaのGUIアプリを配布する方法

作ったアプリを、他の人に使ってもらうための方法です。

jarファイルを作成して実行可能にする

Javaのプログラムは、jarファイルという1つのファイルにまとめられます。

IDEの機能(Eclipseの「エクスポート」やIntelliJの「Artifacts」)を使って、実行可能なjarファイルを作成できます。MANIFEST.MFファイルにメインクラスを指定するのがポイントです。

作成されたmyapp.jarは、java -jar myapp.jarというコマンドで実行できます。

ただし、JavaFXアプリの場合は、利用者のPCにもJavaFXライブラリが必要になるため、単純なjarファイルでは動作しないことが多いです。

JavaFXアプリをネイティブ形式で配布する

JavaFXアプリを配布する最も確実な方法は、jpackageツール(JDK 14以降に付属)を使うことです。

jpackageは、以下のものをすべて1つにまとめて、OSごとのインストーラ(Windowsの.exeやMacの.dmg)を作成してくれます。

  • 作成したアプリ(jarファイル)
  • Javaの実行環境(JRE)
  • JavaFXライブラリ

これにより、利用者のPCにJavaがインストールされていなくても、アプリをインストールして実行できるようになります。

ユーザーに配布する際の注意点

  • 依存ライブラリ:データベース接続ドライバなど、JavaFX以外に使っているライブラリもすべて含める必要があります。
  • クロスプラットフォーム:Windows用のインストーラはWindowsで、Mac用のインストーラはMacで作成する必要があります(jpackageの場合)。

まとめ|JavaのGUIを学ぶならまずSwingから始めよう

JavaのGUI開発には、伝統的で安定したSwingと、モダンで高機能なJavaFXという2つの主要な選択肢があります。

この記事では、それぞれの基本、作り方、そしてツールの使い方までを解説しました。

初心者がつまずきやすいポイント

JavaのGUI学習で多くの人がつまずくのは、以下の3点です。

  1. レイアウトマネージャー(Swing):部品をどう配置するか(BorderLayoutGridLayout)の概念。
  2. イベント処理(Swing)ActionListenerなどの「リスナー」の仕組み。
  3. JavaFXの初期設定:JDKから分離されたライブラリを導入する環境構築。
  • この記事を書いた人
  • 最新記事

トム

・都内自社開発IT企業勤務/javaのバックエンドエンジニア
/java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎

-Java入門