Top / Eclipse / プラグイン開発のTIPS集 / イメージを取り扱う

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? の登録、取得を行います。

プラグイン開発ではどうやるのか

さて、画像を取り扱うクラスはわかりましたが、プラグインのどのメソッドで登録されて、どのタイミングで取り出されているか、きっと一般的な取り扱いがあるだろうなあとおもっていろんなプラグインとかのソースを見てみたんですけど、だいたい以下のようなやり方でイメージデータを扱っているようです。

  1. プラグインディレクトリ/iconsというディレクトリを作成し、その中にgifファイルなどイメージデータをおいておく
  2. プラグインクラスで
    public static final String IMG_VERTICAL = "vertical";
    などとキー名を決めておく
  3. プラグインクラスでAbstractUIPlugin#initializeImageRegistry?(ImageRegistry?)をオーバライド
  4. HogePlugin?.getDefault().getImageRegistry?().getDescriptor(HogePlugin?.IMG_VERTICAL)で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)

で取得可能です。

こうすれば自分で直接ImageRegistry?ImageDescriptor?を作成することもないので、きっとEclipse側が効率的なリソース管理をしてくれるんでしょう。きっと。。


この記事は

選択肢 投票
おもしろかった 0  
そうでもない 0  

Top / Eclipse / プラグイン開発のTIPS集 / イメージを取り扱う

現在のアクセス:13060


*1 たぶん一つの画像データに対して一つしか作成されないのだと思われる

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS