アイコンとイメージ

GUIプログラムにはアイコンは必須といって良いと思いますが、アイコンというのはイメージが張り付いたラベルやボタンに過ぎません。というわけでアイコンを使おうとするとイメージを扱う必要が出てきます。イメージは多くの場合.jpgや.pngといった拡張子を持つ画像ファイルから読み出します。データベースに画像情報が入っている場合もあるでしょう。あるいはそれ以外のどこからか不思議な力で画像を取ってきてもかまいません。とにかくソースとなる画像情報をプログラム上で扱えるようにしたものがイメージと呼ばれます。

SWTの場合イメージはorg.eclipse.swt.graphics.Imageオブジェクトとして扱われます。例えばラベル(Label label;)にイメージ(Image image;)を貼り付けるには、

	label.setImage(image);
とするだけです。

あまりたくさんのイメージを使うとシステム資源をやたらと消費してしまいますので、JFaceではそうしたシステム資源をできるだけ効率的に使えるように、イメージを扱うための枠組みが用意されています。

ImageDescriptor

まず画像情報とImageオブジェクトを関連付けるためのorg.eclipse.jface.resource.ImageDescriptorオブジェクトがあります。ImageDescriptorオブジェクトはイメージ情報そのものは持たずに、画像の元データからImageオブジェクトを作成する手段を提供します。例えば画像ファイルがjava.net.URLオブジェクトで示される処にある場合は、

	ImageDescriptor id = ImageDescriptor.createFromURL(url);
によってImageDescriptorオブジェクトを作成できます。ここからImageオブジェクトを取得するには、例えば
	Image image = id.createImage();
とすればよいわけです。

ImageRegistry

ImageDescriptorを管理するためのクラスとしてはImageRegistryが提供されます。ImageRegistryを使うことで、ウィジット間でのイメージの共有、不要なイメージの開放といった、プログラマが直にやるには面倒な処を考えなくてすむようになります。

ImageRegistryではjava.util.Mapの様に、文字列のキーとImageDescriptorオブジェクトのペアで情報を管理します。プログラムで使用するイメージのImageDescriptorを作っておいて、

	ImageRegistry ir = new ImageRegistry();
	ir.put("key1", ImageDescriptorのインスタンス);
のように、ImageRegistryに情報を記録しておきます。イメージが必要になるところで、
	ir.get("key1");
とすればキーに対応するImageオブジェクト(ImageDescriptorではなく)が取得できます。

ImageRegistryオブジェクトはトップレベルのDisplayオブジェクトが開放されると、自身で管理しているイメージも破棄してくれます。


SWT, JFace  ソフトウェア研究室  PoisonSoft