JavaFX起動時にスプラッシュ・スクリーンを表示する

設定の読み込みなどの初期化処理のためにプログラムの起動に時間がかかることありますよね。ユーザーがプログラムをダブルクリックして起動しようとしたときに すぐに反応がないと ちゃんとダブルクリックできていなかったかな? と心配になったり さらにもう一度ダブルクリックしてしまうこともあります。

少しでも起動に時間がかかるプログラムの場合は 先にスプラッシュ スクリーンを表示しておくことで ユーザーにプログラムの起動が始まっていることが伝わります。また スプラッシュ スクリーンに目を通している間にプログラムが起動することで起動時間を体感的に短く感じる効果もあります。

今回は JavaFX アプリケーションでスプラッシュ スクリーンを表示する方法を紹介します。

スプラッシュ スクリーンとは

スプラッシュ スクリーンとはアプリケーションの起動処理中に表示される画面です。アプリケーションのメイン画面が表示された時点でスプラッシュ スクリーンは非表示になります。

マイクロソフト Office でこのようなスプラッシュ スクリーンが表示されるのを見たことがある人もいると思います。画面は Office 2013 のもの

こんな感じの起動処理中を示す画面を 自分のアプリケーションに追加してみたいと思います。

スプラッシュ スクリーンを画像ファイルとして準備する

実は 画像ファイルをスプラッシュ スクリーンとして表示する機能が Java には標準で備わっています。プログラムコードを書く必要さえなく マニフェストファイルにスプラッシュ スクリーンとして表示したい画像ファイル名を指定するだけです。

このスプラッシュ スクリーン表示は Java の仕組みなので
JavaFX だけでなく Swing AWT でも使うことができます。

とりあえず サンプル画像を用意しました。このファイルを src/img/splash.png として保存しておきます。

JavaFX ウィンドウ アプリケーションを用意する

簡単なウィンドウ アプリケーションを用意しておきましょう。

Sample.java
package com.example; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.Pane; import javafx.stage.Stage; public class Sample extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) throws Exception { stage.setWidth(480); stage.setHeight(320); stage.setScene(new Scene(new Pane())); stage.show(); } }

このプログラムを実行可能 JAR ファイルにするためにマニフェスト ファイルを作成します。

MANIFEST.MF
Main-Class: com.example.Sample Splashscreen-Image: img/splash.png

起動用のメイン クラスの指定ともうひとつ…Splashscreen-Image に画像ファイルのパス JAR ファイル内でのリソースパス を指定します。

ビルド

ソースコード マニフェスト 画像ファイルを以下のようなフォルダー構成で準備しました。

  • C:¥sample
    • MANIFEST.MF
    • src
      • com
        • example
          • Sample.java
      • img
        • splash.png

javac コマンドと jar コマンドを使ってコンパイルと実行可能 JAR の作成をします。

コマンドプロンプト
C:¥sample>javac src¥com¥example¥Sample.java C:¥sample>jar cfm sample.jar MANIFEST.MF -C src .

これで 実行可能 JAR ファイル sample.jar ができました。

実行

さっそく sample.jar を実行してみましょう。

コマンドプロンプト
C:¥sample>java -jar sample.jar

コマンドラインで起動する方法の他にも 拡張子 jar の関連付けがされていれば sample.jar をダブルクリックで起動する方法もあります。

ちゃんとスプラッシュ スクリーンが表示されましたね…。

……ん? なにかおかしいです。

メイン ウィンドウが表示された後もスプラッシュ スクリーンが残ってしまっています。

Swing であれば自動的にスプラッシュ スクリーンが消えてくれるはずですが なぜか JavaFX ではスプラッシュ スクリーンが消えずに残ってしまいます。

JavaFX でスプラッシュ スクリーンを消すには

JavaFX ではスプラッシュ スクリーンを消すために少しだけコードを書く必要があります。難しいことはありません。ただ SplashScreen close メソッドを呼ぶだけです。

SplashScreen splash = SplashScreen.getSplashScreen();
if(splash != null) {
	splash.close();
}

これだけで スプラッシュ スクリーンが消えてくれます。このコードをサンプル プログラムに追加すると以下のようになります。

Sample.java
package com.example; import java.awt.SplashScreen; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.Pane; import javafx.stage.Stage; public class Sample extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) throws Exception { stage.setWidth(480); stage.setHeight(320); stage.setScene(new Scene(new Pane())); stage.show(); SplashScreen splash = SplashScreen.getSplashScreen(); if(splash != null) { splash.close(); } } }

もう一度 コンパイルと実行可能 JAR ファイル作成をしましょう。

コマンドプロンプト
C:¥sample>javac src¥com¥example¥Sample.java C:¥sample>jar cfm sample.jar MANIFEST.MF -C src .

sample.jar ができたら実行します。

コマンドプロンプト
C:¥sample>java -jar sample.jar

さて どうなるでしょうか…。

スプラッシュ スクリーンが表示されて 次に…。

メイン ウィンドウが表示されると同時にスプラッシュ スクリーンが消えました。

うまくいきましたね。

JavaFX でのスプラッシュ スクリーン表示の説明は以上です。