GUIプログラムを使っていると、アイコンなどイメージデータを取り扱うことになりますが、SWTのイメージデータウィジェットであるorg.eclipse.swt.graphics.Imageをばんばん作成するとクラスOSのリソースを結構消費する(らしい)のと、適切にdisposeしなくてはいけないなど、結構面倒です。 そこで画像データはだれかが一括管理すれば効率がよいわけですが、それをしてくれるクラスが org.eclipse.jface.resource.ImageDescriptor org.eclipse.jface.resource.ImageRegistry です。 ImageDescriptorは、ひとつの画像データを使い回すためのsingletonのようなモノみたいで*1、 ImageDescriptor#createImage() でImageクラスを取得します。 ImageRegistryはImageDescriptor?を管理するためのHashMap?を持つクラスで、 public void put(String key, ImageDescriptor descriptor); public ImageDescriptor getDescriptor(String key); でImageDescriptor? の登録、取得を行います。 プラグイン開発ではどうやるのか †さて、画像を取り扱うクラスはわかりましたが、プラグインのどのメソッドで登録されて、どのタイミングで取り出されているか、きっと一般的な取り扱いがあるだろうなあとおもっていろんなプラグインとかのソースを見てみたんですけど、だいたい以下のようなやり方でイメージデータを扱っているようです。
具体的にはこんな感じになっていました。 public class HogetPlugin extends AbstractUIPlugin { public static final String IMG_VERTICAL = "vertical"; //ほかにもキー値を作っておく protected void initializeImageRegistry(ImageRegistry registry) { registerImage(registry, IMG_VERTICAL, "th_vertical.gif"); // ..他にも登録 } private void registerImage(ImageRegistry registry, String key,String fileName){ try { IPath path = new Path("icons/" + fileName); URL url = find(path); if (url != null) { ImageDescriptor desc = ImageDescriptor.createFromURL(url); registry.put(key, desc); } } catch (Exception e) { e.printStackTrace(); } } これで icons/th_vertical.gif のImageDescriptor?が HogePlugin.getDefault().getImageRegistry().getDescriptor(HogePlugin.IMG_VERTICAL) で取得可能です。 このようにしておいて、ImageDescriptor?をImageRegistry?から取得して、そのImageDescriptor?からImageを作成するとしておけばImageのdisposeはEclipse側がやってくれるようです。 この記事は
現在のアクセス:13206 |