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

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

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

今回は、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ではスプラッシュ・スクリーンを消すために少しだけコードを書く必要があります。難しいことはありません。ただ、SplashScreencloseメソッドを呼ぶだけです。

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でのスプラッシュ・スクリーン表示の説明は以上です。