#author("2021-12-14T02:32:34+00:00","","")
#topicpath
----
GUIプログラムを使っていると、アイコンなどイメージデータを取り扱うことになりますが、SWTのイメージデータウィジェットである[[org.eclipse.swt.graphics.Image:http://help.eclipse.org/help30/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/graphics/Image.html]]をばんばん作成するとクラスOSのリソースを結構消費する(らしい)のと、適切にdisposeしなくてはいけないなど、結構面倒です。

そこで画像データはだれかが一括管理すれば効率がよいわけですが、それをしてくれるクラスが
 org.eclipse.jface.resource.ImageDescriptor
 org.eclipse.jface.resource.ImageRegistry
です。

[[ImageDescriptor:http://help.eclipse.org/help30/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/api/org/eclipse/jface/resource/ImageDescriptor.html]]は、ひとつの画像データを使い回すためのsingletonのようなモノみたいで((たぶん一つの画像データに対して一つしか作成されないのだと思われる))、
 ImageDescriptor#createImage()
でImageクラスを取得します。

[[ImageRegistry:http://help.eclipse.org/help30/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/api/org/eclipse/jface/resource/ImageRegistry.html]]はImageDescriptorを管理するためのHashMapを持つクラスで、
 public void put(String key, ImageDescriptor descriptor);
 public ImageDescriptor getDescriptor(String key);
でImageDescriptor の登録、取得を行います。

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

+プラグインディレクトリ/iconsというディレクトリを作成し、その中にgifファイルなどイメージデータをおいておく
+プラグインクラスで
 public static final String IMG_VERTICAL = "vertical";
などとキー名を決めておく
+プラグインクラスでAbstractUIPlugin#initializeImageRegistry(ImageRegistry)をオーバライド
+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側がやってくれるようです。




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

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS