じゃじゃ馬ならし

 

起動を華麗に - SplashScreen

起動時に彩りをあたえられますか?

多くのデスクトップアプリケーションは起動時に何らかの画像が画面中央に表示されます。こういう画像をよくスプラッシュと呼びます。

あの画面はアプリケーションの起動に彩りをあたえるだけでなく、起動の遅さを目立たなくするという効果もあります。

Java のアプリケーションでも、こういうのをやってみたいですよね。

Java SE 6 以前の Java ではどうやっていたかというと、Freame/JFrame オブジェクトをデコレーションなしで使用するか、Winodw/JWindow オブジェクトを使う以外ありませんでした。

でも、どうしても画像が表示されまでに時間がかかってしまいます。順番的に JVM を起動することの方が先で、Frame のインスタンシエーションはかなり後になってしまうので、しかたがないのですが...

表示までに時間がかかってしまうので、なおさら起動時間の遅さを目立たせてしまうこともしばしば。

もう少しなんとかならないかと思っていたら、Java SE 6 ではそれが解消されていました。とても簡単にスプラッシュを表示することが可能になったのです。

 

起動オプションで指定する

まずは一番単純な方法から。

この方法はまったくコードを書く必要がありません。というのも、java の起動オプションで指定するだけだからです。

たとえば、Foo クラスを起動するとして、そこに foo.jpg があり、それをスプラッシュとして表示したいとします。

そのときは、次のように指定します。

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

オプションとして -splash を使用し、コロンの後に表示するイメージを指定します。使用できる画像フォーマットは

の 3 種類です。

たったこれだけで、スプラッシュを表示することができるのです。

Splash

このスプラッシュは Project Looking Glass のスプラッシュですが、こんなのが簡単に実現できるのです。

しかし、起動オプションで指定するというのは、なんだかやりにくく感じるかもしれません。しかし、Java のアプリケーションを起動するためのシェルスクリプトやバッチファイルにしてしまい、そこで起動オプションを指定してあげるようにすればいいと思います。

また、ランチャを作るのでもいいですね。JNI を使えば、ネイティブアプリケーションとして起動できるので、Java ではないように見せかけることも可能です。

 

マニュフェストで指定する

普通のアプリケーションとして配備する場合は起動オプションでもいいのですが、JAR ファイルだけで配備したいときもありますよね。

そんなときにスプラッシュを表示させるには、次に示すような 1 行をマニュフェストファイル (MANIFEST.MF) に追加します。

Splashscreen-Image: foo.jpg

れだけで、スプラッシュが表示されます。

 

プログラムから表示させる

最後の手段はプログラムからスプラッシュを表示させる方法です。

スプラッシュを処理するクラスは java.awt.SplashScreen クラスです。

サンプルのソースコード SplashSample1.java

このサンプルではローカルにある splash.gif をスプラッシュとして表示させます。

import java.awt.SplashScreen;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
 
public class SplashSample1 {
    public SplashSample1() throws MalformedURLException, IOException {
        SplashScreen splashScreen = SplashScreen.getSplashScreen();
  
        URL url = new File("splash.gif").toURI().toURL();
        splashScreen.setImageURL(url);
  
        try {
            Thread.sleep(10000L);
        } catch (InterruptedException ex) {}
    }
  
    public static void main(String[] args) throws MalformedURLException, IOException {
        new SplashSample1();
    }
}

SplashScreen オブジェクトは static なメソッドである getSplashScreen メソッドを使用して取得します。

取得できた後は、画像ファイルの URL を指定して、setImageURL メソッドをコールします。

JAR ファイルの中に画像ファイルが含まれる場合は ClasssLoader#getResource メソッドを用いて URL を取得するようにしましょう。

最後の Thread#sleep は、スプラッシュを長く表示するためのものです。スプラッシュがいつまで表示されるのかよく分からないのですが、ここでは SplashSample1 オブジェクトのインスタンシエーションが終わるまでは表示されるようです。

さて、実行してみます。

C:\temp>java SplashSample1
Exception in thread "main" java.lang.NullPointerException
        at SplashSample1.<init>(SplashSample1.java:12)
        at SplashSample1.main(SplashSample1.java:20)
		
C:\temp>

あれれ、どうやら SplashScreen オブジェクトが取得できなくて、null になっていたようです。

これは次のように起動オプションの -splash をつけるとちゃんと起動できました。

でも、それじゃあまり意味がないような気が... スプラッシュを切り替えることを想定していたのかもしれませんが、バグなのかも。

もう 1 つサンプルを示します。

サンプルのソースコード SplashSample2.java

このサンプルでは表示させているスプラッシュに対して更新をおこなうことができます。

        SplashScreen splashScreen = SplashScreen.getSplashScreen();
 
        Graphics g = splashScreen.getGraphics();
        g.setColor(Color.BLACK);
        g.setFont(new Font("SansSerif", Font.BOLD, 40));
        g.drawString("ちょっと待っててね", 20, 40);
		
        splashScreen.update();

SplashScreen#getGraphics メソッドを使用すると、Graphics オブジェクトを取得することができます。

Graphcis オブジェクトができてしまえば、後は何でもできますね。ここでは文字列を表示しています。

そして、最後に SplashScreen#update メソッドをコールして、スプラッシュを更新します。

Splash

 

おわりに

機能としてみれば全然たいしたことがないのですが、こういうちょっとした気配りが使い勝手を向上することができます。

起動の待ち時間というのは、ただでさえイライラするのですから、スプラッシュなどで少しでも待ち時間を感じさせずにすることも必要なのではないでしょうか。

 

(Nov. 2005)