設定の読み込みなどの初期化処理のためにプログラムの起動に時間がかかることありますよね。ユーザーがプログラムをダブルクリックして起動しようとしたときに、 すぐに反応がないと 「ちゃんとダブルクリックできていなかったかな?」 と心配になったり、 さらにもう一度ダブルクリックしてしまうこともあります。
少しでも起動に時間がかかるプログラムの場合は、 先にスプラッシュ ・ スクリーンを表示しておくことで、 ユーザーにプログラムの起動が始まっていることが伝わります。また、 スプラッシュ ・ スクリーンに目を通している間にプログラムが起動することで起動時間を体感的に短く感じる効果もあります。
今回は、 JavaFX アプリケーションでスプラッシュ ・ スクリーンを表示する方法を紹介します。
スプラッシュ・スクリーンとは
スプラッシュ ・ スクリーンとはアプリケーションの起動処理中に表示される画面です。アプリケーションのメイン画面が表示された時点でスプラッシュ ・ スクリーンは非表示になります。
マイクロソフト Office でこのようなスプラッシュ ・ スクリーンが表示されるのを見たことがある人もいると思います。(画面は Office 2013 のもの)
こんな感じの起動処理中を示す画面を、 自分のアプリケーションに追加してみたいと思います。
スプラッシュ・スクリーンを画像ファイルとして準備する
実は、 画像ファイルをスプラッシュ ・ スクリーンとして表示する機能が Java には標準で備わっています。プログラムコードを書く必要さえなく、 マニフェストファイルにスプラッシュ ・ スクリーンとして表示したい画像ファイル名を指定するだけです。
- このスプラッシュ ・ スクリーン表示は Java の仕組みなので、
JavaFX だけでなく Swing や AWT でも使うことができます。
とりあえず、 サンプル画像を用意しました。このファイルを src/img/splash.png
として保存しておきます。
JavaFXウィンドウ・アプリケーションを用意する
簡単なウィンドウ ・ アプリケーションを用意しておきましょう。
Sample.javapackage 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.MFMain-Class: com.example.Sample Splashscreen-Image: img/splash.png
起動用のメイン ・ クラスの指定ともうひとつ…Splashscreen-Image
に画像ファイルのパス (JAR ファイル内でのリソースパス) を指定します。
ビルド
ソースコード、 マニフェスト、 画像ファイルを以下のようなフォルダー構成で準備しました。
- C:\sample
- MANIFEST.MF
- src
- com
- example
- Sample.java
- example
- img
- splash.png
- com
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.javapackage 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 でのスプラッシュ ・ スクリーン表示の説明は以上です。