アプリケーションを起動させたとき,なかなか表示が行われないとイライラしませんか。

起動にかかる時間は短ければ短いほどいいのですが,どうしても時間がかかってしまうことも多くあります。

そんなときに,なにかしら表示を行うことで,見せかけの起動時間を短くすることができます。そのために使用されるのがスプラッシュです。スプラッシュはアプリケーションの起動時に中央に表示されるイメージのことです。

スプラッシュを表示したとしても,実質的な起動時間に変化はありません。ところが,表示があるとないとでは,ユーザーのイライラ度がずいぶん変化するのです。

J2SE 5.0までは,スプラッシュを表示させる場合,デコレーションのないフレームを使用してきました。しかし,この方法ではスプラッシュが表示されるまでに時間がかかってしまい,本末転倒の結果になってしまいます。

Java SE 6は,やっと標準でスプラッシュの表示に対応しました。アプリケーション側の変更は何もいりません。アプリケーションの起動時にオプションを付けるか,もしくはマニフェスト・ファイルに記述するだけなのです。

スプラッシュの表示

まずは起動オプションによるスプラッシュを表示する方法を試してみます。起動オプションでイメージ・ファイルを指定すると,それがスプラッシュとして使用されます。使用できるイメージ・ファイルはJPEG,PNG,GIFの3種類です。

スプラッシュを表示するためのオプションは-splashです。コロンの後にイメージ・ファイルを指定します。

C:\temp>java -splash:duke.jpg Foo

これだけで,スプラッシュを表示できます。

スプラッシュの表示
図1 スプラッシュの表示

アプリケーションのフレームが表示されるまで,スプラッシュは表示されます。

次にJARファイルの中にイメージ・ファイルを含めている場合です。この場合は,マニフェスト・ファイルで指定します。

Manifest-Version: 1.0
Main-Class: Foo
SplashScreen-Image: duke.jpg

ただし,マニフェスト・ファイルで指定する場合,Main-Classを記述したうえで,起動するときも以下のように-jarでJARファイルを指定する必要があります。

C:\temp>java -jar foo.jar

単にクラスパスにJARファイルを追加するだけではスプラッシュは表示されないので,ご注意ください。

スプラッシュを操作する

スプラッシュを表示するだけなら,上記の方法で行うことができます。しかし,これだけじゃちょっと味気ないかもしれません。

よく,起動時にプログレスバーが表示されたり,ロードしているモジュールを表示しているアプリケーションがありますね。あれを実現してみましょう。

この場合は起動オプションだけというわけにはいきません。プログラムの変更が必要になってきます。

サンプルはこちらからダウンロードできます:SplashSample.java

スプラッシュを扱うためのクラスがjava.awt.SplashScreenクラスです。SplashScreenクラスの機能は多くないので,使うのは簡単です。

public SplashSample() {
    try {
        Thread.sleep(5000L);
    } catch(InterruptedException ex) {}

    // スプラッシュの取得
    SplashScreen splash = SplashScreen.getSplashScreen();

    // スプラッシュに描画を行う
    Graphics2D g = splash.createGraphics();
    g.setFont(new Font("SansSerif", Font.BOLD, 24));
    g.setColor(Color.BLACK);
    g.drawString("もうちょい", 10, 230);

    // スプラッシュの更新
    splash.update();

    try {
        Thread.sleep(5000L);
    } catch(InterruptedException ex) {}

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            JFrame frame = new JFrame("Test");
            frame.setSize(200, 200);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    });
}

まず,SplashScreenオブジェクトを取得します。これにはstaticメソッドのgetSplashScreenメソッドを使用します。

SplashScreenオブジェクトが取得できたら,そこからGraphics2Dオブジェクトを生成します。後はこのGraphics2Dオブジェクトを使用して描画を行います。これは通常のグラフィック処理と同様です。

最後に変更したスプラッシュを更新します。更新にはupdateメソッドを使用します。

このサンプルを実行すると,5秒で描画が切り替わるはずです。前で述べたように,起動するときに-splashでイメージ・ファイルを指定するか,マニフェスト・ファイルで必ず指定してください。

スプラッシュが指定されていないと,getSplashScreenメソッドの戻り値がnullになってしまいます。

スプラッシュの更新
図2 スプラッシュの更新

このサンプルでは文字を描画しただけですが,プログレスバーなどを描画することもできます。もっとも,SwingのJProgressBarクラスを用いることはできないので,自分でプログレスバーを作らなくてはなりませんが。

また,SplashScreen#setImageURLメソッドを使用して,全く異なるイメージに置き換えることも可能です。

スプラッシュは簡単にできて,かつユーザビリティを向上させてくれるものなので,使わない手はないですね。ぜひご活用ください。

著者紹介 櫻庭祐一

横河電機 ネットワーク開発センタ所属。Java in the Box 主筆

今月の櫻庭

櫻庭にとって例年,1月から2月にかけて散財の日々が続きます。というのも,この季節はショコラティエ(チョコレート職人)が腕によりをかけたチョコレートが巷をにぎわすからであります。また,チョコレートを食べるのには冬の室温ぐらいがちょうどいいのです。

もちろん,当然のごとく自分買いです。

今年の目玉はフランス以外に出展するのは初というベルナシオン。また,時期的にはちょっと先になりますがノカチョコレートも気になる存在であります。もちろん,既存のショコラティエも忘れるわけにはいきません。

というわけで,財布はやせ細り,体重だけは増え続けるという日々を過ごすわけであります。