seraphyの日記

日記というよりは過去を振り返るときのための単なる備忘録

Javaアプリケーションの起動時にスプラッシュをつける

JavaSE6以降ではJavaアプリケーションの起動時にスプラッシュスクリーンを表示できるオプションが加わった。
これはアプリケーションのクラスがロードし終わるまえにJava実行ファイル側が表示してくれるものであるため、可能な限り早い段階で画面に表示される。
Javaアプリケーション、とくにSwingなどのGUI画面をもつアプリケーションは多数のクラスを読み込む必要があるため、それ自身が、いくら数キロバイトという小さなアプリケーションであったとしても起動するまで数秒は要すという欠点がある。
(起動してしまえば、けっこう速い。)
この遅さは「あれ、操作まちがえたかな??」とか「もしかして、このアプリ、壊れている??」とか不安になるくらいには十分な時間があり、可能であればスプラッシュを表示して「読み込み中なんだ」とユーザに知らせるのは、ほとんど義務といってよいくらいである。


このスプラッシュに対応するには画像ファイルを1つ用意するだけでよい。


これをjava起動オプションに指定するだけでコードは一切書く必要はない。
(というよりコード上からスプラッシュを表示させることはできない。)
(コードからは、表示されているスプラッシュスクリーンに対してプログレスバーをつけたりなどの操作はできる。)

javaコマンドラインから起動する場合
java -splash:画像ファイル -cp クラスパス ...

残念な事にJDK1.6以外でjavaコマンドを実行すると、-splash:は不明なオプションだと言われてこけてしまうので、バージョンについてはチェックする必要がある。(コマンドから実行する場合、.batや.shからJAVA_HOMEを設定するであろうから、そのあたりはチェック可能とは思われる。)

実行可能jarの場合

マニフェストに「SplashScreen-Image」というキーで画像ファイルを指定する。
たとえば、AntでJar生成時に設定するマニフェストを以下のようにすればよい。

    <jar basedir="work" destfile="${jarName}">
        <manifest>
            <attribute name="Main-Class" value="macjava.Main"/>
            <attribute name="SplashScreen-Image" value="macjava/splash.png"/>
        </manifest>
    </jar>

SplashScreen-Imageで指定する画像ファイルはjar内のものを指定することができる。

JavaSE6以前であれば認識できないオプションであるため何も起きないが、アプリケーションそのものが動かなくなるということはないようだ。

Mac OS Xのアプリケーションバンドルでスプラッシュを表示する場合

これについては後述。