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クラスを取得します。

ImageRegistryImageDescriptor?を管理するための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)

で取得可能です。

このようにしておいて、ImageDescriptor?ImageRegistry?から取得して、そのImageDescriptor?からImageを作成するとしておけばImageのdisposeはEclipse側がやってくれるようです。


この記事は

選択肢 投票
おもしろかった 9  
そうでもない 0  
  • 3.4.2で試していますが、"URL url = find(path);"がdeprecatedのようなので、"URL url = getDefault().getBundle().getEntry("icons/" + fileName);" とすればよいようですね。plugin作りなれてないもので戸惑いました... -- fullry? 2009-10-30 (金) 13:44:45
  • プラグインのディレクトリを取得する にも書いたんですが、Eclipseってプラグインのディレクトリの取得方法がバージョンによって結構変わるんですよね。。 -- きの? 2009-10-30 (金) 20:44:42
  • いまだと reg.put(key, getImageDescriptor?("icons/" + fileName)); でいいぽい。ちょっとは簡潔になりました -- きの? 2014-02-05 (水) 12:37:51

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

現在のアクセス:11972


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

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-10-06 (木) 17:26:18 (1140d)