S-JIS[2013-01-25/2013-06-05] 変更履歴

Eclipseプラグイン 画像クラス

Eclipseプラグイン開発の画像の扱いについて。


概要

Eclipseプラグインでは、画像はorg.eclipse.swt.graphics.Imageクラスで扱う。
(Imageというクラス名は同じだが、java.awt.Imageとは別物)

このImageのインスタンスはImageDescriptorクラスを使って生成する。
また、最終的にdispose()を呼び出して破棄する必要がある。

が、生成(キャッシュ)・破棄については、ImageRegistryというクラスに管理を任せることが出来る。
ImageRegistryに登録したImage(ImageDescriptor)は自動的に破棄されるらしい。


アウトラインのアイコンの例

自作DMDLエディターアウトラインページで、アイコンを表示してみる。

Activator.java

最初に画像を読み込んでキャッシュする。

プラグイン開発プロジェクトを作ったときに生成される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.java(使う側)

そして、アウトラインのラベルを表示する為の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画像

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のアイコン

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で重ね合わせる位置(左上・右上・左下・右下)を指定する。
重ねる画像は自動的に縮小されたりはしないので、隅に寄せる場合は小さな画像を用意しておく必要がある。


Eclipseプラグインへ戻る / Eclipseへ戻る / 技術メモへ戻る
メールの送信先:ひしだま