Eclipseプラグインでは、画像はorg.eclipse.swt.graphics.Imageクラスで扱う。
(Imageというクラス名は同じだが、java.awt.Imageとは別物)
このImageのインスタンスはImageDescriptorクラスを使って生成する。
また、最終的にdispose()を呼び出して破棄する必要がある。
が、生成(キャッシュ)・破棄については、ImageRegistryというクラスに管理を任せることが出来る。
ImageRegistryに登録したImage(ImageDescriptor)は自動的に破棄されるらしい。
自作DMDLエディターのアウトラインページで、アイコンを表示してみる。
最初に画像を読み込んでキャッシュする。
プラグイン開発プロジェクトを作ったときに生成されるActivatorクラスはAbstractUIPluginを継承している。
AbstractUIPluginにはinitializeImageRegistry()というImageRegistryを初期化するメソッドがあるのでそこで画像を登録する。
import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.ui.plugin.AbstractUIPlugin;
public class Activator extends AbstractUIPlugin { 〜
@Override protected void initializeImageRegistry(ImageRegistry reg) { reg.put("DMDLEditor.MODEL_IMAGE", getImageDescriptor("/icons/example.gif")); }
public static ImageDescriptor getImageDescriptor(String path) { return imageDescriptorFromPlugin(PLUGIN_ID, path); } }
getImageDescriptor()は、Activatorクラスが生成されたときに用意されている。(Eclipse3.7)
そして、アウトラインのラベルを表示する為のDMDLLabelProviderクラスで画像を取得する。
import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.graphics.Image;
public class DMDLLabelProvider extends LabelProvider {
@Override
public Image getImage(Object element) {
if (element instanceof ModelToken) {
ImageRegistry registry = Activator.getDefault().getImageRegistry();
Image image = registry.get("DMDLEditor.MODEL_IMAGE");
return image;
}
return null;
}
Eclipseの中で共通の画像(例えばフォルダーやファイル)も使うことが出来る。
import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI;
Image image = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
IMG_OBJ_FOLDER | フォルダー |
IMG_OBJ_FILE | ファイル |
Javaの画像も使うことが出来る。[2013-01-30]
クラス名はEclipseの共有画像と同じISharedImagesだが、パッケージは異なる。
※マニフェストファイルの依存関係で必須プラグインに「org.eclipse.jdt.ui」を加えておく必要がある。
import org.eclipse.jdt.ui.ISharedImages; import org.eclipse.jdt.ui.JavaUI;
Image image = JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_CLASS);
EclipseプロジェクトのアイコンがEPLライセンスで公開されており、使ってよいらしい。[2013-06-05]
(ダウンロードしてファイルとして保存し、Activator.getImageDescriptor()等で読み込む)
複数の画像を重ね合わせてひとつの画像として扱うことが出来る。[2013-01-30]
(基本となる画像に、装飾(デコレーション)用の画像を重ねる)
import org.eclipse.jface.viewers.DecorationOverlayIcon; import org.eclipse.jface.viewers.IDecoration; import org.eclipse.swt.graphics.ImageData;
Image baseImage = JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_CLASS); ImageRegistry registry = Activator.getDefault().getImageRegistry(); final Image decorateImage = registry.get("DMDLEditor.MODEL_IMAGE"); ImageDescriptor decorateDescriptor = new ImageDescriptor() { @Override public ImageData getImageData() { return decorateImage.getImageData(); } }; ImageDescriptor descriptor = new DecorationOverlayIcon(baseImage, decorateDescriptor, IDecoration.BOTTOM_RIGHT); Image image = descriptor.createImage();
IMG_OBJS_CLASSの上に、自分で描いてファイルとして用意したMODEL_IMAGEを重ねている。
DecorationOverlayIconでは、IDecorationで重ね合わせる位置(左上・右上・左下・右下)を指定する。
重ねる画像は自動的に縮小されたりはしないので、隅に寄せる場合は小さな画像を用意しておく必要がある。